题目
leetCode 第 202 题,快乐数
关联类型:双指针
编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」定义为:
对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
如果 可以变为 1,那么这个数就是快乐数。
如果 n 是快乐数就返回 true ;不是,则返回 false 。
示例 1:
输入:19
输出:true
解释:
1^2 + 9^2 = 82
8^2 + 2^2 = 68
6^2 + 8^2 = 100
1^2 + 0^2 + 0^2 = 1
示例 2:
输入:n = 2
输出:false
提示:
1 <= n <= 231 - 1
做题时间
class Solution {
public boolean isHappy(int n) {
}
}
以上给出方法输入参数,完成作答。
题目分析
平方和有三种可能
- 最终会得到 1。
- 最终会进入循环。
- 值会越来越大,最后接近无穷大,对于 3 位数的数字,它不可能大于 243,则不进行考虑
因此可以使用快慢指针的方式,既可以找出是否有环,又能确定是否有快乐数
解答分析
本文只分析本人做题思路,仅供参考,了解一种解题思想,其他各种做题思路请上网查阅。
解答成功:
执行耗时:1 ms,击败了99.72% 的Java用户
内存消耗:35.3 MB,击败了83.74% 的Java用户
class Solution {
public boolean isHappy(int n) {
int slow = n;
int fast = getNext(n);
while (fast != 1 && fast != slow) {
fast = getNext(getNext(fast));
slow = getNext(slow);
}
return fast == 1;
}
public int getNext(int m) {
int num = 0;
while (m > 0) {
num += Math.pow(m % 10, 2);
m = m / 10;
}
return num;
}
}