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# 完成,不仅解决了问题,还体现了良好的工程实践和代码风格。

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

相关推荐
吃好睡好便好10 小时前
创建对角矩阵
开发语言·学习·线性代数·算法·matlab·信息可视化·矩阵
烟雨江南78510 小时前
嘈杂工业场景下的自适应VAD与双码本声纹识别鉴权系统:基于端侧轻量化神经网络与向量量化(VQ)重构
人工智能·深度学习·神经网络·算法·语音识别
过期动态10 小时前
【LeetCode 热题 100】最长连续序列
java·数据结构·spring boot·算法·leetcode·职场和发展
爱和冰阔落10 小时前
Linux 性能优化基石:全景拆解 PRI/NI 优先级算力争夺与 O(1) 调度算法精髓
linux·算法·性能优化
x_xbx10 小时前
LeetCode:94. 二叉树的中序遍历
算法·leetcode·职场和发展
sheeta199811 小时前
LeetCode 补拙笔记 日期:2026.05.25 题目:796. 旋转字符串
笔记·算法·leetcode
_日拱一卒11 小时前
LeetCode:124二叉树中的最大路径和
java·数据结构·算法
魔法阵维护师11 小时前
从零开发游戏需要学习的c#模块,第二十五章(摄像机 —— 让世界比屏幕大)
学习·游戏·c#