1. 快乐数
1.1 题目说明
编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」定义为:
- 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
- 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
- 如果这个过程 结果为 1,那么这个数就是快乐数。
如果 n 是快乐数就返回 true;如果不是,则返回 false。
示例 1
输入:n = 19
输出:true
解释:
1² + 9² = 82
8² + 2² = 68
6² + 8² = 100
1² + 0² + 0² = 1
示例 2
输入:n = 2
输出:false
1.2 题目分析
这个问题类似于判断链表是否有环。我们这里的情况有两种:一种是最后都是 1,一种是进行不同数字之间的循环。
在解决时,我们使用快慢双指针的方法:
- 定义快慢指针。
- 慢指针每次向后移动一步,快指针每次向后移动两步。
- 判断相遇的时候的值。
我们在链表中利用快慢指针进行不同速度的遍历,看看最后两个指针能不能相遇。如果相遇了,说明存在环。这个题中,我们只需要判断相遇的值是不是 1。 我们可以将数字定义为指针状态。例如一开始可以将指针定义为 2,下一次就是 4,那么现在的 slow 就指向了 4,slow 被修改了。 其实这个题有可能存在第三种情况,就是一直进行变化,没有循环(但在数学上对于快乐数问题,非快乐数必然进入循环)。
1.3 代码部分
class Solution {
public:
int bitSum(int n) { // 返回 n 这个数每一位上面的平方和
int sum = 0;
while (n) {
int t = n % 10; // 将最后一位拿出来
sum += t * t;
n /= 10;
}
return sum;
}
bool isHappy( n) {
slow = n, fast = (n);
(slow != fast) {
slow = (slow);
fast = ((fast));
}
slow == ;
}
};


