每日题单 · 2026-10-15
用法
每题先自己写 25 分钟(时间盒),卡住就找我要档位提示;做完把 [x] 勾上。 复盘题不写新笔记,直接在原文出处下方追加「二刷日期 + 一句话卡点」。
🆕 新题(codetop 前端岗频率榜)
🔁 复盘(vault 轮换池)
完成打卡
/**
* 双指针中心扩散法(实时结算 + 索引优化版)
* @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);
};- 新题 2:70. 爬楼梯
/**
* 动态规划(滚动变量优化 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;
};- 复盘 1:125. 验证回文串
/**
* 正则清洗 + 对撞双指针
* 出处:[[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;
};- 复盘 2:242. 有效的字母异位词
/**
* 定长 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(',');
};