题目:编写一个算法来判断一个数 n 是不是快乐数。
那么何为快乐数呢?
快乐数的定义:
- 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
- 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
- 如果这个过程 结果为 1,那么这个数就是快乐数。
如果 n 是 快乐数 就返回 true ;不是,则返回 false 
解题思路👍:
题目提示我们说了,这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。所以我们要注意的是,在这个过程中可能求和的数会出现重复的情况,我们在解题过程中需要考虑到这个条件!
在刷LeetCode题的时候遇到过需要快速判断一个元素是否出现在集合的时候,就需要考虑到哈希法了!
所以在解题的过程中我们就要使用哈希法来判断平方和的结果是否重复了!
另一个难点是:我们需要取平方和结果的个位,如果不熟悉的话,这道题会非常困难!
1.使用哈希法来快速判断是否重复出现平方和。如果 n 不等于1以及record中不存在 n 时,把n加入record中,并且调用getNextN()方法,把getNextN()方法的返回值赋值给n。
public boolean isHappy(int n) {
Set<Integer> record=new HashSet<>(); //使用哈希法
while (n!=1&&!record.contains(n)){
record.add(n);
n=getNextN(n);
}
return n==1;
}
2.getNextN()方法的实现:先初始化res作为存储平方和结果的变量,然后判断n是否大于0,如果大于0时,取传参n的个位赋值给temp,接着把temp的平方和累加给res,最后把取了个位后的n重新赋值给n。
private int getNextN(int n){
int res=0; //初始化平方和的值为0
while (n>0){
int temp=n%10; //取n的个位赋值给temp
res+=temp*temp; //把temp的平方和累加给res
n=n/10; //把取了个位后的n重新赋值给n
}
return res;
}
2305



被折叠的 条评论
为什么被折叠?



