刷题笔记3
242 有效的字母异位词
使用Map统计每个character出现的次数即可
js
/**
* @param {string} s
* @param {string} t
* @return {boolean}
*/
var isAnagram = function(s, t) {
if (s.length!==t.length) return false
let map = new Map()
for (let i=0;i<s.length;i++) {
(map.has(s[i])) ? map.set(s[i], map.get(s[i])+1) : map.set(s[i], 1);
(map.has(t[i])) ? map.set(t[i], map.get(t[i])-1) : map.set(t[i], -1);
}
for (let item of map) {
if (item[1]!==0) return false
}
return true
};
283 移动0
js
/**
* @param {number[]} nums
* @return {void} Do not return anything, modify nums in-place instead.
*/
var moveZeroes = function(nums) {
let j = 0
for (let i=0; i<nums.length; i++) {
if (nums[i]!==0) {
nums[j] = nums[i]
j++
}
}
for (let i=j; i<nums.length; i++) {
nums[i] = 0
}
return nums
};
349 两个数组的交集
优化技巧
- 数组中查找元素的时间复杂度是O(n)
- Set or Map中查找元素的时间复杂度是O(1)
js
var intersection = function(nums1, nums2) {
let resultSet = new Set()
// 将nums2数组转换为Set, 降低时间复杂度O(m*n)->O(n)
let nums2Set = new Set(nums2)
// 遍历nums1
for (let i=0; i<nums1.length; i++) {
if (nums2Set.has(nums1[i])) {
resultSet.add(nums1[i])
}
}
// 返回结果
return Array.from(resultSet)
};
445 两数相加⭐
很不错的 "链表+栈" 的题目
js
var addTwoNumbers = function(l1, l2) {
// 1.将链表中的数字存入栈中
let stack1 = [],
stack2 = []
while (l1!==null) {
stack1.push(l1.val)
l1 = l1.next
}
while (l2!==null) {
stack2.push(l2.val)
l2 = l2.next
}
// cur为最后返回的链表, 使用num存储进位的数字
let cur = null,
num = 0
while (stack1.length!==0 || stack2.length!==0) {
let sum = 0
if (stack1.length!==0) sum+=stack1.pop()
if (stack2.length!==0) sum+=stack2.pop()
sum += num
let node = new ListNode(sum%10)
node.next = cur
cur = node
num = Math.floor(sum/10)
}
if (num!==0) {
let node = new ListNode(num)
node.next = cur
cur = node
}
return cur
};
680 验证回文串 II
双指针 + 辅助函数
js
/**
* @param {string} s
* @return {boolean}
*/
var validPalindrome = function(s) {
// 辅助函数: 判断从位置left到位置right能否构成回文串
function isPalindrome(left, right) {
while (left<right) {
if (s[left]!==s[right]) return false
left++
right--
}
return true
}
// 正文
let left=0,
right=s.length-1
while (left<right) {
if (s[left]!==s[right]) {
return isPalindrome(left+1, right) || isPalindrome(left, right-1)
}
left++
right--
}
return true
};
836 矩形重叠
js
var isRectangleOverlap = function (rec1, rec2) {
if (
rec1[2] <= rec2[0] ||
rec1[1] >= rec2[3] ||
rec1[0] >= rec2[2] ||
rec1[3] <= rec2[1]
) {
return false;
} else {
return true;
}
};
844 比较含有退格的字符串
从后遍历 + 双while循环(先处理退格情况再比较)
js
/**
* @param {string} s
* @param {string} t
* @return {boolean}
*/
var backspaceCompare = function(s, t) {
let backspaceS = 0,
backspaceT = 0
let i = s.length-1,
j = t.length-1
while (i>=0 || j>=0) {
// 对i处理
while (i>=0) {
if (s[i]==='#') {
backspaceS++
i--
}else if (backspaceS>0) {
backspaceS--
i--
}else {
break
}
}
// 对j处理
while (j>=0) {
if (t[j]==='#') {
backspaceT++
j--
}else if (backspaceT>0) {
backspaceT--
j--
}else {
break
}
}
// 判断是否相等
if (s[i]!==t[j]) return false
i--
j--
}
return true
};
905 按奇偶排序数组
双指针
js
/**
* @param {number[]} nums
* @return {number[]}
*/
var sortArrayByParity = function(nums) {
// 双指针
let i=0,
j=nums.length-1
while (i<j) {
if (nums[i]%2===0 && nums[j]%2===1) {
i++
j--
} else if (nums[i]%2===0 && nums[j]%2===0) {
i++
} else if (nums[i]%2===1 && nums[j]%2===0) {
[nums[i], nums[j]] = [nums[j], nums[i]]
i++
j--
} else {
j--
}
}
return nums
};
还有一个可读性差一点, 但比较简洁的答案
js
var sortArrayByParity = function(nums) {
// 双指针
let i=0,
j=nums.length-1
while (i<j) {
if (nums[i]%2===1 && nums[j]%2===0) {
[nums[i], nums[j]] = [nums[j], nums[i]]
}
if (nums[i]%2===0) {
i++
}
if (nums[j]%2===1) {
j--
}
}
return nums
};
922 按奇偶排序数组 II
js
var sortArrayByParityII = function(nums) {
let j = 1
for (let i=0; i<nums.length; i+=2) {
if (nums[i]%2===1) {
// 遍历j, 到达偶数的位置
while (nums[j]%2===1 && j<nums.length) {
j+=2
}
// 开始交换
[nums[i], nums[j]] = [nums[j], nums[i]]
}
}
return nums
};