为何JavaScript回文函数中使用stk.length时循环仅执行4次?
问题:修改循环条件后为何只执行4次?
第一段代码运行完全正常:
const isPalindrome = word => { const stk = []; let rword = ""; for(let i = 0; i < word.length; i++){ stk.push(word[i]); } console.log(stk) console.log(stk.length) for(let i = 0; i < word.length; i++){ rword += stk.pop(); console.log(rword) } return word === rword; } console.log(isPalindrome("racecar"))
但把第二个循环的条件改成stk.length后,循环仅执行4次,这是为什么?
修改后的代码:
const isPalindrome = (word) => { const stk = []; let rword = ""; for (let i = 0; i < word.length; i++) { stk.push(word[i]); } console.log(stk); console.log(stk.length); for (let i = 0; i < stk.length; i++) { rword += stk.pop(); console.log(rword); } return word === rword; }; console.log(isPalindrome("racecar"));
原本期望两段代码运行结果一致。
原因解析
核心问题出在**stk.length是动态变化的**,而word.length是固定值。
拿输入"racecar"来说,它的长度是7,第一段代码的第二个循环会从i=0执行到i=6,总共7次,每次pop()都会把栈里的元素取空,最终rword会得到完整的反转字符串"racecar"。
但第二段代码的循环条件是i < stk.length,初始时stk.length是7,循环过程中每次stk.pop()都会让栈的长度减1,同时i每次循环都会加1,两者的对比变化如下:
- 第1次循环:i=0,stk.length=7 → 满足条件,执行pop,stk.length变为6,i变为1
- 第2次循环:i=1,stk.length=6 → 满足条件,执行pop,stk.length变为5,i变为2
- 第3次循环:i=2,stk.length=5 → 满足条件,执行pop,stk.length变为4,i变为3
- 第4次循环:i=3,stk.length=4 → 满足条件,执行pop,stk.length变为3,i变为4
- 第5次循环:i=4,stk.length=3 → 4 < 3 不成立,循环直接终止
这就导致循环只执行了4次,rword只拼接了4个字符("race"),自然和原字符串不相等。
如果想让循环条件用stk.length且执行完整次数,有两种解决办法:
- 提前把栈的长度存成固定变量:
const len = stk.length; for (let i = 0; i < len; i++) { rword += stk.pop(); } - 改用
while循环,直接判断栈是否为空:while (stk.length > 0) { rword += stk.pop(); }
内容的提问来源于stack exchange,提问作者Lakhwinder Sidhu
相关产品推荐
相关产品推荐

