649b2f9c85bd171608eaf5910bb15177.jpg
977. 有序数组的平方
可以使用两个指针分别指向位置 0 和 n-1,每次比较两个指针对应的数,选择较大的那个逆序放入答案并移动指针。
var sortedSquares = function(A) {
let len = A.length
let left = 0
let right = len - 1
let pos = len - 1
let ans = []
while(left <= right) {
if (A[left] * A[left] > A[right] * A[right]) {
ans[pos] = A[left] * A[left]
left++
} else {
ans[pos] = A[right] * A[right]
right--
}
pos--
}
return ans
};
189. 旋转数组
将数组的元素向右移动 k 次后,尾部 k%n
个元素会移动至数组头部,其余元素向后移动 k%n
个位置。可以先将所有元素翻转,这样尾部的 k%n
个元素就被移至数组头部,然后再翻转 [0, k%n-1]
区间的元素和 [k%n, n-1]
区间的元素即能得到最后的答案。
var rotate = function(nums, k) {
k %= nums.length
reverse(nums, 0, nums.length - 1)
reverse(nums, 0, k -1)
reverse(nums, k, nums.length - 1)
};
let reverse = function(nums, start, end) {
while(start < end) {
let temp = nums[start]
nums[start] = nums[end]
nums[end] = temp
start++
end--
}
}
283.移动零
使用双指针,左指针指向当前已经处理好的序列的尾部,右指针指向待处理序列的头部。右指针不断向右移动,每次右指针指向非零数,则将左右指针对应的数交换,同时左指针右移。
注意:
左指针左边均为非零数
右指针左边直到左指针处均为零。
因此每次交换,都是将左指针的零与右指针的非零数交换,且非零数的相对顺序并未改变。
var moveZeroes = function(nums) {
if (nums == null || nums.length <= 1) {
return
}
let left = 0, right = 0
while(right < nums.length) {
if (nums[right] !== 0) {
swap(nums, left, right)
left++
}
right++
}
};
let swap = function(nums, left, right) {
let temp = nums[left];
nums[left] = nums[right];
nums[right] = temp;
}
167. 两数之和 II - 输入有序数组
var twoSum = function(numbers, target) {
let left = 0; right = numbers.length;
while(left < right) {
if (numbers[left] + numbers[right] === target) {
let res = [left+1, right+1];
return res;
} else if (numbers[left] + numbers[right] < target) {
left++;
} else {
right--;
}
}
};
344. 反转字符串
var reverseString = function(s) {
let left = 0, right = s.length - 1
while(left <= right) {
[s[left], s[right]] = [s[right], s[left]]
left++
right--
}
};
557. 反转字符串中的单词 III
var reverseWords = function (s) {
let arr = s.split(' ')
let newArr = arr.map((item) => {
return reverse(item)
})
return newArr.join(' ')
};
let reverse = function (s) {
s = s.split('')
let left = 0, right = s.length - 1
while (left <= right) {
[s[left], s[right]] = [s[right], s[left]]
left++
right--
}
return s.join('')
};
876. 链表的中间结点
使用快慢不同的两个指针遍历,快指针一次走两步,慢指针一次走一步。当快指针到达终点时,慢指针刚好走到中间
var middleNode = function(head) {
let slow = head, fast = head
while(fast && fast.next) {
slow = slow.next
fast = fast.next.next
}
return slow
};
19. 删除链表的倒数第 N 个结点
假设设定了双指针 fast 和 slow。当 fast 指向末尾的 null,fast 与 slow 之间相隔的元素个数为 n 时,那么删除掉 slow 的下一个指针就完成了要求。
let removeNthFromEnd = function(head, n) {
let prev = new ListNode(0)
prev.next = head
let fast = prev
let slow = prev
// fast 指针走到 n 的前面节点
while(n--) {
fast = fast.next
}
while(fast && fast.next) {
slow = slow.next
fast = fast.next
}
slow.next = slow.next.next
return prev.next
}