快乐数(简单)
2020年5月25日
题目来源:力扣
解题
这道题关键是找到无限循环的终止点。
可以用集合来记录出现过的数字,当出现了一个出现过的数字则说明进入循环,返回false;当出现1时,返回true。但这种做法时间复杂度和空间复杂度不确定性太大,如果有过多的数可能会导致栈溢出,不建议使用。
用在LeetCode—环形链表中使用过的“快慢指针法”来判断循环,如果有循环,那么快指针和慢指针终究会相遇,相遇时判断快指针或慢指针的值是否为1,若为1返回true,不为1返回false。
如果快指针优先走到了1,1的平方也还是1,会继续循环1,等待慢指针跟它相遇。
class Solution {
public boolean isHappy(int n) {
int fast=n,slow=n;
do{
slow=num(slow);
fast=num(fast);
fast=num(fast);
}while(slow!=fast);
return (fast==1);
}
public int num(int n){
int sum=0;
while(n!=0){
sum+=Math.pow(n%10,2);
n/=10;
}
return sum;
}
}