LeetCode 202简单数学 & 几何
快乐数 图解题解
这道题到底在问什么
不断把数字替换成各位平方和,最终到 1 就是快乐数,否则进入循环。
- 示例
- 19 → 82 → 68 → 100 → 1
最优解:一步一步想明白
- 3无限模拟不知道什么时候停。
- 4状态不是到 1 就会进入循环;用 seen 集合或快慢指针检测循环。
- 5快乐数:反复把 n 换成它各数位的平方和,能到 1 就是快乐数。对 19:1²+9²=82,并把 19 记入 seen。
- 6对 82:8²+2²=68。82 记入 seen。
- 7对 68:6²+8²=100。
- 8对 100:1²+0²+0²=1。
- 9链走到 1 → 19 是快乐数,返回 true。
- 10关键帧:不快乐的数会陷入固定循环 4→16→37→58→89→145→42→20→4,永远到不了 1。所以规则只有两种结局:到 1(快乐) 或 seen 命中重复(循环→不快乐)。数位平方和会把大数迅速压小(3 位数最大 243),落入有限范围必然重复或到 1。
- 13一句话记住:状态不是到 1 就会进入循环;用 seen 集合或快慢指针检测循环。
- 22这题学完不要乱跳,下一步去对应专题 /leetcode-animation/ds?k=math 连刷同类题;卡住时用 AI 答疑问“我的状态定义哪里不稳”。
⚠️ 容易写错的地方
✗ 错:不检测循环、无限模拟
✓ 对:用 seen 集合或快慢指针,重复就停
不快乐的数永远到不了 1,会死循环。
✗ 错:数位平方和算错(漏个位/没平方)
✓ 对:逐位 x%10 取数字、d*d 累加
算错下一个数,整条链就偏了。
✗ 错:忘了 n==1 的出口
✓ 对:循环条件 = n!=1 且 n 没见过
到 1 要立即停并返回 true。
完整代码(Python / C++ / Java)
Python
class Solution:
def isHappy(self, n):
def square_sum(x):
s = 0
while x:
x, d = divmod(x, 10)
s += d * d # 累加各数位平方
return s
seen = set()
while n != 1 and n not in seen:
seen.add(n)
n = square_sum(n)
return n == 1 # 到 1 快乐;否则陷入循环C++
class Solution {
public:
int squareSum(int x) {
int s = 0;
while (x) { int d = x % 10; s += d * d; x /= 10; }
return s;
}
bool isHappy(int n) {
unordered_set<int> seen;
while (n != 1 && !seen.count(n)) {
seen.insert(n);
n = squareSum(n);
}
return n == 1;
}
};Java
class Solution {
int squareSum(int x) {
int s = 0;
while (x > 0) { int d = x % 10; s += d * d; x /= 10; }
return s;
}
public boolean isHappy(int n) {
Set<Integer> seen = new HashSet<>();
while (n != 1 && !seen.contains(n)) {
seen.add(n);
n = squareSum(n);
}
return n == 1;
}
}套路模板 · 模拟 + 判圈
# 快乐数骨架 · 模拟 + 判圈
seen = set()
while n != 1 and n not in seen:
seen.add(n)
n = 各数位平方和(n) # 关键转移
return n == 1 # 到 1 快乐;命中 seen 是循环复杂度
时间复杂度
O(log n)
数位平方和让数字迅速变小,迭代次数有界
空间复杂度
O(log n)
seen 集合存途经的数;用快慢指针可降到 O(1)
看不够?换成动画再走一遍
上面的推演每一步都对应一帧动画。点开交互动画版,能一步步看着 快乐数 的数据怎么变、指针怎么走,还能切 Python / Java / C++ 跟着练。
面试官可能追问
核心思路是什么?+
反复取数位平方和形成一条链;到 1 即快乐,否则必进循环。检测循环用 seen 集合(O(log n) 空间)或快慢指针 Floyd(O(1) 空间)。
这道题为什么用「几何」,换最直接的暴力解会差在哪?+
几何抓住了本题的结构特征,把暴力解里重复的工作省掉;暴力解通常要多嵌套一层枚举,数据一大就超时。具体对比见上文「暴力解及其卡点」与「最优解逐步推演」两节。
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。