You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

爬楼梯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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 06:54:04