题目描述:
- 不可能出现无限循环的情况,也就是说必定会进入环;
- 我们需要判断的只有,进入环的时候是1还是其他位置?
题目解析:
- 我们定义快慢指针,快指针走两步,慢指针走一步。
- 由于取每一位的平方和相加的步骤经常要用到,我们把它封装到方法里。
示例代码:
//快乐数
class Solution {
public static int bitSum(int n) {
int sum=0;
while(n !=0) {
sum+=(n%10)*(n%10);
n/=10;
}
return sum;
}
public boolean isHappy(int n) {
int show=n;
int fast=bitSum(n);
while(show!=fast) {
show=bitSum(show);
fast=bitSum(bitSum(fast));
}
return show==1?true:false;
}
}
为什么是快指针走两步,慢指针走一步?
其实这就好比操场跑步,如果你和另一个人都是相同速度,那么就永远也不可能相遇
为什么最开始时快指针比慢指针多走一步?
第一次判断时,slow 和 fast 是一样的,直接跳出循环,导致判断错误!
先看这个代码
再看这个代码
为啥fast指针每次要走两步?能不能是三步?
步伐差距越大,越容易错过环内的相遇点
数学角度(为什么两步刚好)
-
假设你有一个循环,快指针每次走两步,慢指针每次走一步。
-
这时,快指针会追上慢指针,最终在环内相遇。
-
如果快指针每次走三步,它可能会跳过某些位置,从而无法在合理时间内相遇。