爬楼梯1/2步组合统计:JS代码缺失组合排错及思路验证
爬楼梯问题代码排查与思路验证
思路可行性结论
你提出的「存储正反字符串去重」思路不可行。你的代码核心问题不是结果重复,而是字符串生成逻辑本身无法产出1211这类包含「1出现在2后方」的组合,没有生成的内容自然无法通过去重逻辑补全。
现有代码核心问题
- 生成逻辑缺陷:你仅对最后一个出现的
1做操作,要么修改为2,要么和后一位相邻的2交换,这种逻辑永远只能生成「所有2都在1右侧」的字符串,自然会丢失1211这类1穿插在2中间的组合。 - 计数逻辑错误:你初始
sum=1默认计入全1的情况,但后续循环中还可能出现重复统计或者漏统计的问题,比如n=3时你的代码最终输出是2,和正确结果3不符。 - 逻辑冗余:你每次生成字符串后都要求和校验是否等于目标阶数,实际上当你确定使用k个
2时,总长度固定为n-k,所有对应长度的1和2的组合天然和为n,完全不需要额外求和校验。
正确实现方案
爬楼梯问题本质是斐波那契数列问题:到达第n阶的走法 = 到达第n-1阶走法(最后爬1步) + 到达第n-2阶走法(最后爬2步),时间复杂度O(n),空间复杂度O(1),实现如下:
function climbStairs(n) { if (n <= 2) return n let prev1 = 1, prev2 = 2 for (let i = 3; i <= n; i++) { const curr = prev1 + prev2 prev1 = prev2 prev2 = curr } return prev2 }
如果你一定要用枚举组合的方式实现,建议用回溯法生成所有符合条件的组合,逻辑如下:
function climbStairs(n) { let count = 0 function backtrack(remaining) { if (remaining === 0) { count++ return } if (remaining < 0) return backtrack(remaining - 1) backtrack(remaining - 2) } backtrack(n) return count }
内容的提问来源于stack exchange,提问作者Lex
相关产品推荐
相关产品推荐

