题目如下:
这道题是用了快慢指针来解决的。
1、因为 n 的范围在1 到 2^31 - 1 之间,所以它的各位数的平方和不会超过810(10个9的平方和才810)因此它不断运行求各位数的平方和这个运算810次之后它一定会出现重复的数, 也就是它不断运算后一定会有循环,所以就用快慢指针来解决这个问题。
2、快慢指针:定义一个慢指针走在后面,一个快指针走在前面,有循环的话一定会相遇,快乐数的相遇点一定是1,非快乐数的相遇点一定不是1,所以走完后判断相遇点是否为1就可以了。
ps:这道题的走不是想链表一样的指向下一个,而是通过调用函数来更新快慢指针的值来走。
下面是我的代码了:
class Solution {
public:
int digitsSum(int n)//每个位置上的数字的平方和
{
int sum = 0;
while(n)
{
int d = n % 10;
sum += d * d;
n /= 10;
}
return sum;
}
bool isHappy(int n) {
int slow = n, fast = digitsSum(n);//快慢指针
while(slow != fast)//循环
{
slow = digitsSum(slow);
fast = digitsSum(digitsSum(fast));
}
if(slow == 1)
return true;
return false;
}
};
感谢大家的支持