NowCoder 311
https://www.nowcoder.com/practice/16409dd00ab24a408ddd0c46e49ddcf8
难度:中等
高频面试题汇总:https://www.yuweihung.com/posts/2025/lc-hot/
- 问题分析 :圆环有 10 个点(0 到 9),从点 0 出发,每次移动可以到相邻的点(顺时针或逆时针)。要求恰好 n 步后回到点 0 的方法数。
- 动态规划设置 :使用一个数组 curr 来保存当前步数下到达每个点的方案数。初始时,curr[0] = 1,表示 0 步时在原点。
- 状态转移 :对于每一步,计算下一步到达每个点的方案数。每个点可以从其相邻的两个点转移过来,即 next[j] = curr[left] + curr[right],其中 left 和 right 是 j 的相邻点。
- 模数处理 :由于结果可能非常大,每次加法后对 MOD 取模。
- 结果提取 :经过 n 步后,curr[0]即为回到原点的方法数。
class Solution {
public:
int circle(int n) {
const int MOD = 1e9 + 7;
vector f(n + 1, vector<int>(10, 0));
f[0][0] = 1;
for (int i = 0; i < n; i++) {
for (int j = 0; j < 10; j++) {
f[i + 1][j] = (f[i][(j - 1 + 10) % 10] + f[i][(j + 1) % 10]) % MOD;
}
}
return f[n][0];
}
};