方法一:使用set存放
用set存放不是快乐数的可能性,重点是找到循环节点(我们认为非快乐数都会进入一个循环)
class Solution
{
public:
int calculate(int n) {
int now=0;
while(n) {
now+=(n%10)*(n%10);
n=n/10;
}
return now;
}
bool isHappy(int n){
unordered_set<int> memory;
while(1){
n=calculate(n);
if(n==1) return true;
if(memory.count(n)!= 0) return false;
memory.insert(n);
}
return true;
}
};
方法二:使用快慢指针去找循环,非常巧妙
class Solution
{
public:
int calculate(int n) {
int now=0;
while(n) {
now+=(n%10)*(n%10);
n=n/10;
}
return now;
}
bool isHappy(int n){
int fast=n;
int slow=n;
do{
slow=calculate(slow);
fast=calculate(fast);
fast=calculate(fast);
}while(slow!=fast);
return slow==1;
}
};