javascript 算法 LeetCode 编号 70 - 爬楼梯

目录

[【计时开始 - 15分钟】](#【计时开始 - 15分钟】)

[7-12 分钟:编写 JavaScript 代码](#7-12 分钟:编写 JavaScript 代码)

[12-14 分钟:简单测试与代码审查](#12-14 分钟:简单测试与代码审查)

[14-15 分钟:最终检查](#14-15 分钟:最终检查)

【比赛结束】

[JavaScript 版快闪赛的特点](#JavaScript 版快闪赛的特点)


如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。

【计时开始 - 15分钟】

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

  • 同前,斐波那契数列变种。
  • F(n) = F(n-1) + F(n-2),F(1)=1, F(2)=2。

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

  • 算法选择:动态规划,迭代法,O(1) 空间。
  • JavaScript 工程落地考虑 :
    • 函数定义 :通常是一个函数,例如 function climbStairs(n) 或箭头函数。LeetCode 可能会提供一个类结构,但也常常就是函数。
    • 整数范围 :JavaScript 的 number 类型是双精度浮点数,但对于整数运算,其安全整数范围(Number.MAX_SAFE_INTEGER)远超 45 阶斐波那契数,所以 number 类型足够。
    • 变量:需要两个变量存储前两项的值。
    • 循环:从 3 迭代到 n。
    • 边界处理 :n=1, n=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 = 1, prev1 = 2
    • i = 3: currentWays = 2 + 1 = 3. prev2 = 2, prev1 = 3.
    • 循环结束,返回 prev1 (3)。正确。
  • 考虑 n=1:代码已处理。

  • 代码风格:

    • var climbStairs = function(n) { ... }; 或 function climbStairs(n) { ... } 是常见的 JS 函数定义方式。LeetCode 提供了 var climbStairs = function(n) { ... }; 的模板。
    • 变量命名 prev2, prev1, currentWays 良好。
    • 注释:使用 JSDoc 风格 (/** ... */),包含 @param, @return, @description,这是 JavaScript 的标准实践。
    • let 和 const 的使用:let 用于变量 prev1, prev2(会改变),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 标准的注释格式,提高了代码可读性和可维护性。
  • 严格相等 === :比 == 更安全,避免隐式类型转换。

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。

相关推荐
w_zero_one6 小时前
算法--模拟
java·数据结构·算法
小灰灰搞电子6 小时前
Rust+Slint 实现FTP客户端调试助手源码分享
开发语言·后端·rust
外收内放6 小时前
面向对象高级(实战案例)
开发语言·python·学习
秋天的怀念_David6 小时前
算法一千零一夜 · 第十三夜 幻方,武侠世界里的数学迷宫
java·程序人生·算法
zimoyin7 小时前
在 C# 里嵌入 JavaScript:用 Jint 做可热更新的自动化脚本(从入门到踩坑)
javascript·c#·自动化
秋天的怀念_David7 小时前
算法一千零一夜 · 第十四夜 幻方与奇妙的二进制
java·程序人生·算法
薛定e的猫咪7 小时前
(ICLR 2020)MAML 靠的不是快速学习,而是特征复用
人工智能·深度学习·学习·算法·机器学习
fanruitian7 小时前
python else用法
开发语言·python
FRing037 小时前
JavaScript入门到精通二十六(变量提升、函数剩余参数、展开运算符、ES6箭头函数)
开发语言·前端·javascript·es6·箭头函数
云深麋鹿7 小时前
C++ | 基于红黑树实现mymap与myset
开发语言·c++