Leetcode 202 Happy Number 弗洛伊德判环解循环

时间:2023-07-27 21:39:38

今天先谈下弗洛伊德判环,弗洛伊德判环原来是在一个圈内有两人跑步,同时起跑,一人的速度是另一人的两倍,则那个人能在下一圈追上另一个人,弗洛伊德判环能解数字会循环出现的题,比如说判断一个链表是不是循环链表。在程序中具体表现为

one = change(one); //一倍速度
two = change(change(two));//两倍速度

即一倍速度的人调用生成函数change一次,两倍速度的人调用生成函数change两次。

Leetcode 202 Happy Number 就是这样一道简单的题,实现方法有很多,但是弗洛伊德判环是比较简单,同时效率也是较高的那种。

class Solution {
public:
int change(int n){
int ans = 0;
for ( ; n!=0 ; ans+= (n%10)*(n%10),n/=10);
return ans;
}
bool isHappy(int n) {
int one = n;
int two = n;
while(1){
one = change(one); //一倍速度
two = change(change(two));//两倍速度
if(one == 1 || two == 1) return true;
if(one == two) return false;
} }
};