
思路
核心思路:使用哈希集合检测循环
- 计算平方和:编写辅助函数计算数字各位数字的平方和
- 循环检测:使用哈希集合记录已经出现过的数字
- 终止条件 :
- 如果得到1,返回true
- 如果数字重复出现,说明进入循环,返回false
代码实现分析
cpp
class Solution {
public:
// 辅助函数:计算数字各位数字的平方和
int sum(int n) {
int ans = 0;
while (n > 0) {
int d = n % 10; // 获取最后一位数字
n /= 10; // 去掉最后一位
ans += d * d; // 平方并累加
}
return ans;
}
// 主函数:判断是否是快乐数
bool isHappy(int n) {
unordered_set<int> mp; // 用于记录已经出现过的数字
while (n != 1) { // 循环直到得到1
n = sum(n); // 计算平方和
// 如果这个数字已经出现过,说明进入循环
if (!mp.count(n)) {
mp.insert(n); // 记录新数字
} else {
return false; // 出现重复,不是快乐数
}
}
return true; // 得到1,是快乐数
}
};
1. 平方和计算函数
cpp
int sum(int n) {
int ans = 0;
while (n > 0) {
int d = n % 10; // 取最后一位数字
n /= 10; // 去掉最后一位
ans += d * d; // 平方累加
}
return ans;
}
- 例如:n=19 → 1²+9²=82
- 例如:n=82 → 8²+2²=68
2. 主循环逻辑
cpp
while (n != 1) {
n = sum(n); // 计算下一个数字
if (!mp.count(n)) { // 如果数字未出现过
mp.insert(n); // 记录
} else { // 如果数字已出现过
return false; // 检测到循环
}
}