C# 算法 LeetCode 编号 70 - 爬楼梯

目录

[C# 实现的思考与执行](# 实现的思考与执行)

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

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

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

【比赛结束】

[C# 版快闪赛的工程落地提升](# 版快闪赛的工程落地提升)


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

C# 实现的思考与执行

  • 理解与模式识别 :与 Python 版本相同。题目是斐波那契数列的变种。F(n) = F(n-1) + F(n-2)F(1)=1, F(2)=2
  • 算法选择:动态规划(迭代,O(1) 空间复杂度)是最佳选择。
  • C# 工程落地考虑
    • 命名空间和类 :LeetCode C# 题目通常要求在 Solution 类下实现。
    • 方法签名public int ClimbStairs(int n)
    • 整数溢出 :题目提示 n <= 45。斐波那契数列增长很快。F(45) 约为 1.8 x 10^9,在 int 的范围内(最大值约 2.1 x 10^9)。所以 int 类型足够,不需要 long
    • 可读性:变量命名、注释。

【计时开始 - 15分钟】

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

  • 同 Python 版本:斐波那契数列,F(n) = F(n-1) + F(n-2)F(1)=1, F(2)=2

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

  • 使用迭代法(动态规划)。
  • 需要变量存储 F(i-2) 和 F(i-1) 的值。
  • 初始化 a (代表 F(i-2)) 和 b (代表 F(i-1))。
  • 循环计算 F(i) 直到 F(n)。
  • 处理 n=1n=2 的边界情况。

7-12 分钟:编写 C# 代码

// 假设在一个名为 Solution 的类中实现

public class Solution

{

/// <summary>

/// 计算爬 n 阶楼梯的总方法数。

/// 每次可爬 1 或 2 阶。

/// </summary>

/// <param name="n">楼梯总阶数。</param>

/// <returns>到达楼顶的不同方法数。</returns>

public int ClimbStairs(int n)

{

// --- 思路:动态规划,斐波那契数列变种 ---

// F(i) = F(i-1) + F(i-2)

// 边界条件:F(1) = 1, F(2) = 2

// 处理基本边界情况

if (n == 1)

{

return 1;

}

if (n == 2)

{

return 2;

}

// 使用 O(1) 空间复杂度的动态规划

// prev1 存储 F(i-1) 的值,prev2 存储 F(i-2) 的值

int prev2 = 1; // 对应 F(1)

int prev1 = 2; // 对应 F(2)

// 从第 3 阶开始迭代计算

// 循环从 3 到 n,共 n-2 次迭代

for (int i = 3; i <= n; i++)

{

// 计算当前阶数的方法数

int 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
    • 代码直接返回 2。正确。
  • 示例 2:n = 3
    • prev2 = 1, prev1 = 2
    • i = 3: currentWays = 2 + 1 = 3. prev2 = 2, prev1 = 3.
    • 循环结束,返回 prev1 (3)。正确。
  • 考虑 n=1:代码已处理。
  • 代码风格
    • 类名 Solution,方法名 ClimbStairs,参数 n,返回类型 int,符合 C# 和 LeetCode 规范。
    • 变量命名 prev2, prev1, currentWaysa, b 更具描述性,提升了可读性。
    • /// <summary>...</summary> XML 文档注释,符合 C# 最佳实践,清晰说明了方法功能、参数和返回值。
    • 思路注释也已加入。
  • 工程落地:边界条件处理清晰,变量命名有提升,注释规范。

14-15 分钟:最终检查

  • 代码逻辑正确,通过示例。
  • 符合 C# 和 LeetCode 提交要求。
  • 注释和命名规范比 Python 版有所提升,更符合 C# 工程实践。
  • 整数范围 int 足够。

【比赛结束】

最终提交(模拟):

using System;

public class Solution

{

/// <summary>

/// 计算爬 n 阶楼梯的总方法数。

/// 每次可爬 1 或 2 阶。

/// </summary>

/// <param name="n">楼梯总阶数。</param>

/// <returns>到达楼顶的不同方法数。</returns>

/// <remarks>

/// 思路:该问题是典型的斐波那契数列变种。

/// 到达第 `i` 阶的方法数 F(i) 等于到达第 `i-1` 阶(再爬1步)与到达第 `i-2` 阶(再爬2步)的方法数之和。

/// 递推关系:F(i) = F(i-1) + F(i-2)。

/// 基本边界条件:

/// F(1) = 1 (只可能爬 1 步)

/// F(2) = 2 (可能爬 1+1 或 2)

///

/// 采用动态规划(迭代法)实现,空间复杂度为 O(1),时间复杂度为 O(n)。

/// </remarks>

public int ClimbStairs(int n)

{

// 处理基本边界情况

if (n == 1)

{

return 1;

}

if (n == 2)

{

return 2;

}

// 使用 O(1) 空间复杂度的动态规划

// prev2 存储 F(i-2) 的值,prev1 存储 F(i-1) 的值

int prev2 = 1; // 对应 F(1)

int prev1 = 2; // 对应 F(2)

// 从第 3 阶开始迭代计算,直到第 n 阶

// 循环会执行 n - 2 次

for (int i = 3; i <= n; i++)

{

// 计算当前阶数的方法数

int 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;

}

}

C# 版快闪赛的工程落地提升

  • 更规范的注释 :使用了 XML 文档注释 (/// <summary>),这是 C# 开发的业界标准,能生成 API 文档,对 IDE 提示也很有帮助。
  • 更具描述性的变量名prev1, prev2, currentWaysa, b 等更清晰地传达了变量的含义,即使没有注释,也能大致理解。
  • 添加 using System; (虽然在这个例子中不是必需的,但通常是 C# 文件开头的一部分)。
  • 更详细的思路说明 :在 remarks 标签中,进一步展开了递推关系、边界条件和算法复杂度。

总体而言,15 分钟内用 C# 完成,不仅解决了问题,还体现了良好的工程实践和代码风格。

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

相关推荐
Tairitsu_H19 小时前
[LC优选算法#17] 链表 | 合并 K 个升序链表 | K个⼀组翻转链表
数据结构·算法·链表
_olone19 小时前
Luogu P2704 [NOI2001] 炮兵阵地
c++·算法·状压dp
kebidaixu20 小时前
两轮BMS 防打火策略详解
算法
wabs66620 小时前
关于动态规划【力扣1035.不相交的线和53.最大子数组和的思考】
算法·leetcode·动态规划
退休倒计时20 小时前
【每日一题】LeetCode 199. 二叉树的右视图 TypeScript
算法·leetcode·typescript
可编程芯片开发20 小时前
通过MATLAB实现PID控制器,积分分离控制器以及滑模控制器
算法
kebidaixu21 小时前
两轮BMS 短路保护策略详解
算法
zwenqiyu21 小时前
非线性字符串数据结构串讲
数据结构·c++·学习·算法
z小猫不吃鱼21 小时前
03 Optimal Brain Surgeon 详解:Hessian 剪枝为什么有效?
算法·机器学习·剪枝
硕风和炜21 小时前
【LeetCode: 1301. 最大得分的路径数目 + DP】
java·算法·leetcode·动态规划·dp·记忆化搜索