解题思路
202. 快乐数 参考了官方题解
根据题目可知最终只有二种结果:在某个值后无限循环或者收敛到1。这样就可以
- 哈希表:用哈希表把每次结果都存入,如果碰到相同的数就说明开始循环了;或者检测到要存入的值是1时,就说明它是快乐数,因为已经收敛到1了。
- 快慢指针:
如果 n 是一个快乐数,即没有循环,那么快指针最终会比慢指针先到达数字 1。
如果 n 不是一个快乐的数字,那么最终快指针和慢指针将在同一个数字上相遇。
代码
方法一:哈希表
class Solution {
//方法一:哈希表 :根据题目可知最终只有二种结果:在某个值后无限循环或者收敛到1
public static boolean isHappy(int n) {
Set<Integer> set = new HashSet<>();
while(n!=1 && !set.contains(n)) { //不是最终的二种情况就一直循环
set.add(n);
n=getNext(n);
}
return n==1;
}
public static int getNext(int n) {
int sum = 0;
int temp = 0;
while(n>0) {
temp = n%10;
n/=10;
sum +=temp*temp;
}
return sum;
}
}
方法二:快慢指针
class Solution {
//方法二:快慢指针
//如果 n 是一个快乐数,即没有循环,那么快跑者最终会比慢跑者先到达数字 1。
//如果 n 不是一个快乐的数字,那么最终快跑者和慢跑者将在同一个数字上相遇。
public static boolean isHappy(int n) {
//注意二个指针的初始值不能都为n,不然后面while条件就直接不成立,就直接成false了
int slow=n,fast = getNext(n);
while(fast!=1 && fast!=slow) {
slow = getNext(slow);
fast = getNext(getNext(fast));
}
return fast == 1;
}
public static int getNext(int n) {
int sum = 0;
int temp = 0;
while(n>0) {
temp = n%10;
n/=10;
sum +=temp*temp;
}
return sum;
}
}