将大问题转化为小问题,通过递归依次解决各个小问题。
334.反转字符串 reverse-string
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[]
的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
输入:["h","e","l","l","o"] 输出:["o","l","l","e","h"]
思路:递归、交换都可以
var reverseString = function(s) {
reverse(s,0,s.length-1);
return s;
};
var reverse = function(s, left, right){ //递归写法
if(left >= right){
return;
}
[s[left], s[right]] = [s[right],s[left]];
reverse(s,left+1,right-1);
}
var reverseString = function(s) {
let len = s.length;
for (let i = 0; i < len >> 1; i++) {
[s[i], s[len - 1 - i]] = [s[len - 1 - i], s[i]];
}
};
24.两两交换链表中的节点 swap-nodes-in-pairs
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
输入:head = [1,2,3,4] 输出:[2,1,4,3]
function swapPairs(head: ListNode | null): ListNode | null {
return helper(head)
};
function helper(head: ListNode | null): ListNode | null {
if(head === null || head.next === null){
return head
}
let headNext: ListNode = head.next.next
let p: ListNode = head.next
p.next = head
head.next = helper(headNext)
return p
}
给定一个整数 n,生成所有由 1 ... n 为节点所组成的 二叉搜索树 。
function generateTrees(n: number): Array<TreeNode | null> {
if (n === 0) {
return [null]
}
return generate(1, n)
};
function generate(start: number, end: number): Array<TreeNode | null> {
if (start > end) {
return [null]
}
const ans: TreeNode[] = []
for (let i = start; i <= end; i++) {
const left: TreeNode[] = generate(start, i - 1)
const right: TreeNode[] = generate(i + 1, end)
for (let j = 0; j < left.length; j++) {
for (let k = 0; k < right.length; k++) {
const root: TreeNode = new TreeNode(i)
root.left = left[j]
root.right = right[k]
ans.push(root)
}
}
}
return ans
}
function fib(n: number): number {
if (n === 0 || n === 1) {
return n
}
return fib(n - 1) + fib(n - 2)
};