每日一道算法题043 快乐数

456 阅读1分钟

题目

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. 最终会得到 1。
  2. 最终会进入循环。
  3. 值会越来越大,最后接近无穷大,对于 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;
    }

}