class Solution { public: int bitSquareSum(int n) { int sum = 0; while(n > 0) { int bit = n % 10; sum += bit * bit; n = n / 10; } return sum; } bool isHappy(int n) { int slow = n, fast = n; do{ slow = bitSquareSum(slow); fast = bitSquareSum(fast); fast = bitSquareSum(fast); }while(slow != fast); return slow == 1; } }; 作者:金字塔下的小蜗牛 链接:https://leetcode.cn/problems/happy-number/solutions/21454/shi-yong-kuai-man-zhi-zhen-si-xiang-zhao-chu-xun-h/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
时间: 2025-04-04 21:00:45 浏览: 23
这段代码的功能是判断一个正整数是否为「快乐数」。所谓「快乐数」是指通过不断替换该数为其每个位置上的数字平方和,最后能够得到 1 的数称为快乐数。
#### 函数解析
1. **bitSquareSum函数**
- 参数:n (输入的正整数)
- 功能:计算并返回当前数字各个位上数字平方之和。
```cpp
int bitSquareSum(int n) {
int sum = 0; // 初始化sum=0;
while(n > 0){
int bit = n % 10; // 取出n的个位数
sum += bit * bit; // 累加其平方值至sum中
n /= 10; // 移除刚刚取过的那一位(更新n),继续循环直到所有位都被处理完
}
return sum;
}
```
2. **isHappy函数**
- 参数:n (待检测的正整数)
- 返回值:true 或 false 根据给定数值是否属于“快乐数”
此处采用快慢指针算法解决环形链表问题,避免陷入死循环。具体步骤如下:
- 设置两个变量slow 和 fast均指向初始值n;
- Slow每次只走一步即调用一次`bitSquareSum()`方法;Fast则连跳两步即连续两次调用了`bitSquareSum()`;
- 当两者相遇的时候检查此时的结果是不是等于1,若果等于1,则证明这是一个快乐数反之不是。
```cpp
bool isHappy(int n) {
int slow = n, fast = n;
do{ // 使用do...while保证至少执行一轮操作
slow = bitSquareSum(slow); // slow 每次移动一步
fast = bitSquareSum(fast);
fast = bitSquareSum(fast); // fast 每次移动两步
}while(slow != fast);
return slow == 1; // 最终比较结果看是否会收敛到1
}
```
### 解法原理简述:
利用数学知识可以得知对于任意非负整数反复进行类似变换都会进入有限长度的一条路径或者形成闭环。本题目的关键就在于发现这样一个事实——当存在环路时要么会回到起点也就是1(如果是快乐数的话),要不然就卡在一个固定的周期里无法逃脱出去。因此借助这种特性我们可以有效判定某个特定整数到底能不能成为所谓的"happy number".
阅读全文