C# 算法 LeetCode 编号 70 - 爬楼梯
目录
C# 实现的思考与执行
【计时开始 - 15分钟】
7-12 分钟:编写 C# 代码
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。 - 可读性:变量命名、注释。
- 命名空间和类:LeetCode C# 题目通常要求在
【计时开始 - 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=1和n=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 = 2i = 3:currentWays = 2 + 1 = 3.prev2 = 2,prev1 = 3.- 循环结束,返回
prev1(3)。正确。
- 考虑 n=1:代码已处理。
- 代码风格:
- 类名
Solution,方法名ClimbStairs,参数n,返回类型int,符合 C# 和 LeetCode 规范。 - 变量命名
prev2,prev1,currentWays比a, 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,currentWays比a,b等更清晰地传达了变量的含义,即使没有注释,也能大致理解。 - 添加
using System;(虽然在这个例子中不是必需的,但通常是 C# 文件开头的一部分)。 - 更详细的思路说明:在
remarks标签中,进一步展开了递推关系、边界条件和算法复杂度。
总体而言,15 分钟内用 C# 完成,不仅解决了问题,还体现了良好的工程实践和代码风格。
如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。
