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;
};

相关笔记