202. 快乐数 - 力扣(LeetCode)
理解:根据定义一共有两种情况
1.最后变为1
2.最后变为环
思路:可以把两个情况都认为有环,第一个是环一直为1
(快满指针法) 定义一个快指针和慢指针,慢指针走一步,快指针走两步。
而这里的指针不是真正的指针,可以用整型值代替它所代表的意义,比如:19会变化为82,那slow就由19经过平方和变化为82,fast走两步相当于19变化为82在变化为68,相当于变化两次,用这样伪指针的做法来表示快慢指针。
解释一下下面代码:把求平方和封装成函数更方便,fast首先定义为bitsum(n)是因为若定义为n循环进不去。
class Solution
{
public:
int bitsum(int n)
{
int sum = 0;
while(n)
{
int t = n%10;
sum += t*t;
n = n/10;
}
return sum;
}
bool isHappy(int n)
{
int slow = n, fast = bitsum(n);
while(slow!=fast)
{
slow = bitsum(slow);
fast = bitsum(bitsum(fast));
}
return slow ==1;
}
};