# 202. 快乐数
编写一个算法来判断一个数n
是不是快乐数。
「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是无限循环但始终变不到 1。如果可以变为1,那么这个数就是快乐数。
如果 n 是快乐数就返回 True
;不是,则返回False
。
示例:
输入:19
输出:true
解释:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1
思路:
思路1:快慢指针(推荐,速度快)
- 既然是无限循环,就容易想到环形链表。力扣 #160 相交链表
- 使用快慢指针
- 快指针一次循环计算两次
- 慢指针一次循环计算一次
- 在无限循环过程中,快慢指针一定会相交。
- 如果相交点为1,就说明是快乐数,反之不是。
思路2:哈希表
- 使用哈希表保存出现过的平方和。
- 如果再次出现且此数不为1,就说明不是快乐数。反之就是快乐数。
代码:
双指针法:
class Solution {
public boolean isHappy(int n) {
//快慢指针
int slow = n,fast = n;
while(true){
slow = calc(slow);
fast = calc(fast);
fast = calc(fast);
if(fast == slow) break;
}
if(fast == 1) return true;
else return false;
}
public int calc(int num){
int res = 0;
//计算数字每一位的平方和
while(num>0){
res+= (num%10)*(num%10);
num /= 10;
}
return res;
}
}
哈希表法:
Python:
class Solution:
def calc(self,n:int) -> int:
res = 0;
while(n>0):
res += (n%10) * (n%10);
n = n//10;
return res;
def isHappy(self, n: int) -> bool:
lst = set();
while(True):
n = self.calc(n)
if n not in lst:
lst.add(n)
elif n != 1:
return False
else:
return True
Java:
class Solution {
public boolean isHappy(int n) {
//哈希表
Set<Integer> s = new HashSet<>();
while(n!=1 && !s.contains(n)){
s.add(n);
n = calc(n);
}
return n == 1;
}
public int calc(int num){
int res = 0;
while(num>0){
res+= (num%10)*(num%10);
num /= 10;
}
return res;
}
}