1. 快乐数问题解析
快乐数(Happy Number)是一个有趣的数学概念,也是算法面试中的经典题目。我第一次接触这个问题是在准备技术面试时,当时就被它简洁的定义和巧妙的解法所吸引。让我们先明确什么是快乐数:对于一个正整数,每次将其替换为各位数字的平方和,重复这个过程直到变为1(快乐数)或进入不包含1的循环(非快乐数)。
举个例子,19就是一个快乐数:
1² + 9² = 82
8² + 2² = 68
6² + 8² = 100
1² + 0² + 0² = 1
而18则不是快乐数,它会进入4→16→37→58→89→145→42→20→4的循环。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 解题思路与算法选择
2.1 暴力解法与问题分析
最直观的解法就是按照定义不断计算平方和,直到结果为1或发现循环。但如何高效检测循环成为关键。我最初尝试的方法是设置一个最大迭代次数(比如1000次),超过则认为进入循环。这种方法虽然简单,但存在明显缺陷:
- 无法保证1000次足够检测所有可能的循环
- 对于某些数可能需要更多次迭代才能确定
- 效率不高,特别是对于大数
2.2 哈希表解法原理
更聪明的做法是利用哈希表(HashSet)记录已经出现过的数字。这是因为:
- 非快乐数必定会进入循环,意味着某个数字会重复出现
- 哈希表可以O(1)时间复杂度检测元素是否存在
- 空间复杂度与数字的位数成正比,而非数值大小
这个解法的精妙之处在于将无限循环检测转化为重复元素检测问题。我在实际编码面试中多次使用这个技巧,它展示了如何将数学特性转化为高效的算法实现。
3. 详细实现与代码解析
3.1 Java实现详解
让我们深入分析提供的Java实现代码:
java复制class Solution {
public boolean isHappy(int n) {
Set<Integer> sumSet = new HashSet<>();
while (n != 1) {
int sum = 0;
while (n != 0) {
int num = n % 10;
n /= 10;
