125. 验证回文串
var isPalindrome = function(s) {
s = s.trim()
if(!s.length) return true
// 关键修改:增加 0-9 匹配数字
let arr = s.toLowerCase().match(/[a-z0-9]/g)
if(!arr) return true
let left = 0
let right = arr.length-1
while(left < right) {
if(arr[left] === arr[right]) {
left++
right--
} else {
return false
}
}
return true
};
392. 判断子序列
var isSubsequence = function(s, t) {
let i= 0, j = 0
while(i< s.length && j < t.length) {
if(s[i] === t[j]) {
i++
}
j++
}
return i === s.length
};
167. 两数之和 II - 输入有序数组
var twoSum = function(numbers, target) {
// 1. 初始化对撞双指针
let left = 0;
let right = numbers.length - 1;
// 2. 循环条件:指针不重合
while (left < right) {
const sum = numbers[left] + numbers[right];
// 3. 状态更新
if (sum === target) {
// 题目要求返回从 1 开始的下标
return [left + 1, right + 1];
} else if (sum < target) {
left++; // 和太小了,左指针右移以增大和
} else {
right--; // 和太大了,右指针左移以减小和
}
}
return [-1, -1];
};
11. 盛最多水的容器
var maxArea = function(height) {
let max = 0
let left = 0
let right = height.length - 1
while(left < right) {
max = Math.max(max , (right - left) * Math.min(height[left], height[right]))
if(height[left] > height[right]) {
right --
} else {
left++
}
}
return max
};
15. 三数之和
var threeSum = function(nums) {
let res = [];
// 1. 必须先排序
nums.sort((a, b) => a - b);
for (let i = 0; i < nums.length - 2; i++) {
// 如果当前数字大于 0,后面都是正数,三个正数相加不可能等于 0,直接结束
if (nums[i] > 0) break;
// 【第一处去重】:如果和上一个数字相同,跳过,避免重复的三元组
if (i > 0 && nums[i] === nums[i - 1]) continue;
let left = i + 1;
let right = nums.length - 1;
while (left < < right) {
const count = nums[i] + nums[left] + nums[right];
if (count === 0) {
res.push([nums[i], nums[left], nums[right]]);
// 【第二处去重】:找到解后,跳过左边和右边重复的数字
while (left < right && nums[left] === nums[left + 1]) left++;
while (left < right && nums[right] === nums[right - 1]) right--;
// 记得移动指针,否则又死循环了
left++;
right--;
} else if (count < 0) {
// 和太小了,左指针右移
left++;
} else {
// 和太大了,右指针左移
right--;
}
}
}
return res;
};
相关笔记