一、题目描述
二、解法
class Solution {
public boolean isHappy(int n) {
/**
* 方法1:用Set检测循环
*/
/*Set<Integer> set = new HashSet<>();
while (n != 1) {
if (set.contains(n)) { //如果存在,说明陷入了死循环
return false;
}
set.add(n);
n = squareSum(n);
}
return true;*/
/**
* 方法2:类似于快慢指针的思想。
* 慢指针每次做一次转换,快指针每次做两次转换
* 如果出现死循环,那么快的指针(值)一定会追上慢的指针(值)
* 如果没有循环重复,那么最后快慢指针也会相等,且都等于1。
*/
int fast = squareSum(n);
int slow = n;
while (fast != 1 && fast != slow) {
fast = squareSum(squareSum(fast));
slow = squareSum(slow);
}
return fast == 1;
}
// 把一个数替换成每一位的平方和
private int squareSum(int num) {
int res = 0;
while (num != 0) { // 一定要牢记代码实现取出各个位数字的思路
int temp = num % 10;
num /= 10;
res += temp * temp;
}
return res;
}
}