题目描述
编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」定义为:
对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
如果 可以变为 1,那么这个数就是快乐数。
如果 n 是快乐数就返回 true ;不是,则返回 false 。
示例 1:
输入:19
输出:true
解释:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1
示例 2:
输入:n = 2
输出:false
提示:
1 <= n <= 231 - 1
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/happy-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解法1- 借助哈希法
根据题目定义说明,
需要定义sum来保存 各个位数的平方之和
可能会 无限循环,也有可能为 1
即:sum ==1时,返回true;
sum !=1 时,无线循环;
那何时返回false呢??—当sum值出现重复时,肯定会陷入无限循环
快速判断一个元素是否出现在集合中 –-哈希法;
class Solution {
public int getSum(int n){
int sum = 0;
while (n > 0){
sum += (n%10)*(n%10);
n = n/10;
}
return sum;
}
public boolean isHappy(int n) {
HashSet<Integer> sumSet = new HashSet();
int sum = 0;
while (sum != 1)
{
sum = getSum(n);
if(sumSet.contains(sum)){
return false;
}else{
sumSet.add(sum);
}
n = sum;
}
return true;
}
}
解法2–快慢指针
思路分析:
根据每次调用getSum()得到的值可以构成一个隐式链表。
那么该题就转换成,判断链表是否有环–>弗洛伊德循环算法。龟兔赛跑。
有环 --不是快乐数;
否则 – 是快乐数;
监控两个值,借用快慢指针来求解该题