每日题单 · 2026-10-15

用法

每题先自己写 25 分钟(时间盒),卡住就找我要档位提示;做完把 [x] 勾上。 复盘题不写新笔记,直接在原文出处下方追加「二刷日期 + 一句话卡点」。

🆕 新题(codetop 前端岗频率榜)

题目难度频率状态
5. 最长回文子串中等28🔁(已刷过,重做)
70. 爬楼梯简单28🔁(已刷过,重做)

🔁 复盘(vault 轮换池)

题目难度频率备注
验证回文串简单10复盘 · 出处:GRD 字符串
有效的字母异位词简单3复盘 · 出处:GRD 字符串

完成打卡

/**
 * 双指针中心扩散法(实时结算 + 索引优化版)
 * @param {string} s
 * @return {string}
 */
var longestPalindrome = function(s) {
    if (s.length < 2) return s;
 
    let start = 0, maxLen = 1;
 
    const expand = (i, j) => {
        while (i >= 0 && j < s.length && s[i] === s[j]) {
            const curLen = j - i + 1;
            if (curLen > maxLen) {
                maxLen = curLen;
                start = i;
            }
            i--;
            j++;
        }
    };
 
    for (let i = 0; i < s.length; i++) {
        expand(i, i);     // 奇数中心
        expand(i, i + 1); // 偶数中心
    }
 
    return s.slice(start, start + maxLen);
};
/**
 * 动态规划(滚动变量优化 O(1) 空间)
 * @param {number} n
 * @return {number}
 */
var climbStairs = function (n) {
    let a = 1, b = 1; // 虚拟台阶 0 阶有 1 种,1 阶有 1 种
    for (let i = 2; i <= n; i++) {
        [a, b] = [b, a + b];
    }
    return b;
};
/**
 * 正则清洗 + 对撞双指针
 * 出处:[[GRD 字符串]]
 * @param {string} s
 * @return {boolean}
 */
var isPalindrome = function(s) {
    let str = s.trim().toLowerCase().match(/[a-z0-9]/g);
    if (!str) return true;
    let left = 0, right = str.length - 1;
    while (left < right) {
        if (str[left] === str[right]) {
            left++;
            right--;
        } else {
            return false;
        }
    }
    return true;
};
/**
 * 定长 26 频次数组计数
 * 出处:[[GRD 字符串]]
 * @param {string} s
 * @param {string} t
 * @return {boolean}
 */
var isAnagram = function(s, t) {
    if (s.length !== t.length) return false;
    const arrs = new Array(26).fill(0);
    const arrt = new Array(26).fill(0);
 
    for (let i = 0; i < s.length; i++) {
        arrs[s.charCodeAt(i) - 97]++;
        arrt[t.charCodeAt(i) - 97]++;
    }
    return arrs.join(',') === arrt.join(',');
};