26. 删除排序数组中的重复项
可以设立双指针(一快一慢)。快指针不断++。当快指针和慢指针的元素不相等时,将快指针指向的元素赋值给慢指针的下一个元素:
/*** @param {number[]} nums* @return {number}*/var removeDuplicates = function(nums) {let j = 0;for(let i = 1; i < nums.length; i++) {if(nums[i] !== nums[j]) {nums[j+1] = nums[i]j++}}return j + 1};
189. 旋转数组
2种解法:
- 在数组最后截取出来k个元素,然后
unshift到数组头部 - 遍历k次,每次弹出数组最后一个放在最前面
/*** @param {number[]} nums* @param {number} k* @return {void} Do not return anything, modify nums in-place instead.*/var rotate = function(nums, k) {for(let i = 0; i < k; i++) {nums.unshift(nums.pop())}return nums};
21. 合并两个有序链表
该题可以使用递归法:
/*** Definition for singly-linked list.* function ListNode(val, next) {* this.val = (val===undefined ? 0 : val)* this.next = (next===undefined ? null : next)* }*//*** @param {ListNode} l1* @param {ListNode} l2* @return {ListNode}*/var mergeTwoLists = function(l1, l2) {if(l1 === null) {return l2;}if(l2 === null) {return l1;}if(l1.val < l2.val) {l1.next = mergeTwoLists(l1.next, l2)return l1;} else {l2.next = mergeTwoLists(l1, l2.next)return l2}};
88. 合并两个有序数组
测试用例:
[3, 5, 0, 0, 0]2[1, 2, 6]3
设立三个指针:p1,p2,p。分别指向 nums1数组自身实际存在最后一个值的下标,nums2数组自身实际存在最后一个值的下标,两个数组合并后的总长度最后一个值下标。
按照从后向前进行遍历。如果p2的值大于p1的值,那么放在nums1的最后面 (替换0);如果小于或者等于,则将p1自身的值复制到p指针的位置。跑完一遍while后:
3, 5, 3, 5, 6
因为p2是慢指针,只有值存到了p1内才会继续移动。所以此时p2指针指向了nums2的1号下标。
此时需要手动矫正,将nums1内从0开始,删除下标为1及其之前的元素;然后将nums2内剩余没复制过去的元素,复制过去(index为1)
/*** @param {number[]} nums1* @param {number} m* @param {number[]} nums2* @param {number} n* @return {void} Do not return anything, modify nums1 in-place instead.*/var merge = function(nums1, m, nums2, n) {let p1 = m - 1;let p2 = n - 1;let p = m + n - 1;while(p1 > -1 && p2 > -1) {nums1[p--] = nums1[p1] > nums2[p2] ? nums1[p1--] : nums2[p2--]}nums1.splice(0, p2 + 1)nums1.unshift(...nums2.splice(0, p2 + 1))};
1. 两数之和
本题借助Map表的思维,将target和当前值的差值存放为key(数组index)。向后遍历过程中,如果当前遍历到的值在Map表内,则代表有相对差值,匹配成功。
/*** @param {number[]} nums* @param {number} target* @return {number[]}*/var twoSum = function(nums, target) {let map = [];for (let i = 0; i < nums.length; i++) {let dis = target - nums[i];if (map[nums[i]] === undefined) {map[dis] = i} else {return [map[nums[i]], i]}}};
283. 移动零
设立快慢指针,慢指针指向0的位置,快指针不断向后指。如果找到不是0的元素,则和慢指针交换元素。如果这两个指针没重叠,则将快指针的位置设置为0
/*** @param {number[]} nums* @return {void} Do not return anything, modify nums in-place instead.*/var moveZeroes = function(nums) {let j = 0;let i = 0;while(i < nums.length) {if (nums[i] !== 0) {nums[j] = nums[i]if (i !== j) {nums[i] = 0}j++}i++}return nums};
66. 加一
将数字数组从后向前遍历。数字挨个+1。
- 如果加1后的数字➗10取余数为0,则代表要进位,继续向前遍历+1。
- 如果取余数不为0,则代表不需要进位。直接返回数组即可
- 如果碰上999,9999,999999这种数字,倒序循环后并不会生成最高位的1,则需要手动补1
/*** @param {number[]} digits* @return {number[]}*/var plusOne = function(digits) {for (let i = digits.length - 1; i > -1; i--) {digits[i]++digits[i] = digits[i] % 10;if(digits[i] !== 0) {return digits}}return [1, ...digits]};
