什么情况下会无限循环?
一时也没想到。
哈希表检测
不过反过来想,如果出现了循环,我们只要能检测出来就行了:循环的意思是每个位置数字的平方和等于变换过(可能多次)的那个数的每个位置数字的平方和,那检测一个值有没有出现过,就很简单,使用哈希表就可以了。
class Solution {
public:
bool isHappy(int n) {
unordered_set<int> s;
int sum;
while(true){
sum = 0;
while(n){
sum += (n % 10) * (n % 10);
n /= 10;
}
if(sum == 1) return true;
if(s.count(sum)) return false;//出现循环
s.insert(sum);
n = sum;
}
return false;
}
};
最后再来说说为什么上面的代码可行,也就是为什么不会进入死循环,直接看官方题解的表格就明白了,或者自己举几个例子:
快慢指针(类似)
检测链表是否有环的时候,使用过快慢指针。这儿其实也是同样的思路,只不过没有链表而已。
class Solution {
public:
int getNext(int n){
int res= 0;
while(n){
res += (n % 10) * (n % 10);
n /= 10;
}
return res;
}
bool isHappy(int n) {
int slow = n;
int fast = getNext(n);
while(fast != 1 && fast != slow){
slow = getNext(slow);
fast = getNext(getNext(fast));
}
return fast == 1;
}
};