Login
首页 > 技术资讯 > 算法与数据结构 > 最新文章

javascript 算法 LeetCode 编号 70 - 爬楼梯

CSDN博客 2026-05-16 12:12:53 人看过

【计时开始 - 15分钟】

0-2 分钟:理解题目,识别模式

同前,斐波那契数列变种。

F(n) = F(n-1) + F(n-2)F(1)=1F(2)=2

2-7 分钟:设计 JavaScript 实现思路

算法选择:动态规划,迭代法,O(1) 空间。

JavaScript 工程落地考虑

函数定义:通常是一个函数,例如 function climbStairs(n) 或箭头函数。LeetCode 可能会提供一个类结构,但也常常就是函数。

整数范围:JavaScript 的 number 类型是双精度浮点数,但对于整数运算,其安全整数范围(Number.MAX_SAFE_INTEGER)远超 45 阶斐波那契数,所以 number 类型足够。

变量:需要两个变量存储前两项的值。

循环:从 3 迭代到 n。

边界处理n=1n=2

注释:使用 JSDoc 风格 (/** ... */)。

7-12 分钟:编写 JavaScript 代码

/**  * @param {number} n 楼梯总阶数 (1 <= n <= 45)。  * @return {number} 到达楼顶的不同方法数。  *  * @description  * 思路:该问题是一个经典的斐波那契数列变种。  * 到达第 i 阶的方法数,等于到达第 i-1 阶(再走1步)与到达第 i-2 阶(再走2步)的方法数之和。  * 令 F(i) 为到达第 i 阶的方法数。  * 递推关系:F(i) = F(i-1) + F(i-2)。  *  *  边界              条件:  * F(1) = 1 (只可能走 1 步)  * F(2) = 2 (可能走 1+1 或 2)  *  * 采用动态规划(迭代法)实现,空间复杂度为 O(1),时间复杂度为 O(n)。  * JavaScript 的 number  类 型足以处理 F(45) 的结果。  */ var climbStairs = function(n) {     // 处理基本边界情况     if (n === 1) {         return 1;     }     if (n === 2) {         return 2;     }

    // 使用 O(1) 空间复杂度的动态规划     // prev2 存储 F(i-2) 的值,prev1 存储 F(i-1) 的值     let prev2 = 1; // 对应 F(1)     let prev1 = 2; // 对应 F(2)

    // 从第 3 阶开始迭代计算,直到第 n 阶     // 循环执行 n - 2 次     for (let i = 3; i <= n; i++) {         // 计算当前阶数的方法数          const               currentWays = prev1 + prev2;

        // 更新 prev2 和 prev1,为下一轮迭代做准备         prev2 = prev1;       // 原来的 F(i-1) 变为下一轮的 F(i-2)         prev1 = currentWays; // 新计算出的 F(i) 变为下一轮的 F(i-1)     }

    // 循环结束后,prev1 中存储的就是 F(n) 的值     return prev1; };

12-14 分钟:简单测试与代码审查


示例 1:n = 2

n === 2 返回 2。正确。


示例 2:n = 3

prev2 = 1prev1 = 2

i = 3currentWays = 2 + 1 = 3prev2 = 2prev1 = 3.

循环结束,返回 prev1 (3)。正确。


考虑 n=1:代码已处理。


代码风格

var climbStairs = function(n) { ... }; 或 function climbStairs(n) { ... } 是常见的 JS 函数定义方式。LeetCode 提供了 var climbStairs = function(n) { ... }; 的模板。

变量命名 prev2prev1currentWays 良好。

注释:使用 JSDoc 风格 (/** ... */),包含 @param@return@description,这是 JavaScript 的标准实践。

let 和 const 的使用:let 用于变量 prev1prev2(会改变),const 用于 currentWays(在循环内部计算一次,不改变)。

===:使用严格相等比较,这是 JS 的良好实践。


工程落地:代码结构清晰,逻辑正确,注释规范,边界处理到位。

14-15 分钟:最终检查

代码逻辑正确,通过示例。

符合 JavaScript 和 LeetCode 提交要求。

number 类型足够。

【比赛结束】

最终提交(模拟):

/**  * @param {number} n 楼梯总阶数 (1 <= n <= 45)。  * @return {number} 到达楼顶的不同方法数。  *  * @description  * 思路:该问题是一个经典的斐波那契数列变种。  * 到达第 i 阶的方法数,等于到达第 i-1 阶(再走1步)与到达第 i-2 阶(再走2步)的方法数之和。  * 令 F(i) 为到达第 i 阶的方法数。  * 递推关系:F(i) = F(i-1) + F(i-2)。  *  * 边界条件:  * F(1) = 1 (只可能走 1 步)  * F(2) = 2 (可能走 1+1 或 2)  *  * 采用动态规划(迭代法)实现,空间复杂度为 O(1),时间复杂度为 O(n)。  * JavaScript 的 number 类型足以处理 F(45) 的结果。  */ var climbStairs = function(n) {     // 处理基本边界情况     if (n === 1) {         return 1;     }     if (n === 2) {         return 2;     }

    // 使用 O(1) 空间复杂度的动态规划     // prev2 存储 F(i-2) 的值,prev1 存储 F(i-1) 的值     let prev2 = 1; // 对应 F(1)     let prev1 = 2; // 对应 F(2)

    // 从第 3 阶开始迭代计算,直到第 n 阶     // 循环执行 n - 2 次     for (let i = 3; i <= n; i++) {         // 计算当前阶数的方法数         const currentWays = prev1 + prev2;

        // 更新 prev2 和 prev1,为下一轮迭代做准备         prev2 = prev1;       // 原来的 F(i-1) 变为下一轮的 F(i-2)         prev1 = currentWays; // 新计算出的 F(i) 变为下一轮的 F(i-1)     }

    // 循环结束后,prev1 中存储的就是 F(n) 的值     return prev1; };

JavaScript 版快闪赛的特点

函数定义:使用 var functionName = function(params) {...} 或 function functionName(params) {...} 结构。

变量声明let 和 const 的使用,强调了变量的可变性。

JSDoc 注释:符合 JavaScript 标准的注释格式,提高了代码可读性和可维护性。

严格相等 ===:比 == 更安全,避免隐式类型转换。

版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载、或以其他方式使用本站《原创》内容,违者将追究其法律责任。本站文章内容,部分图片来源于网络,如有侵权,请联系我们修改或者删除处理。

编辑推荐

热门文章