202. 快乐数

202. 快乐数

哈希表(set)

思路
将每次循环计算得到的数加入哈希表(set) set1 中,加入前判断这个数是否已存在于 set1 中,
若存在,说明出现了循环,不是快乐数,返回 false;
若不存在,将计算得到的数加入哈希表(set) set1 中。
当计算得到的数等于1时,说明是快乐数,退出 while 循环,返回 true。

import java.util.Set;
import java.util.HashSet;

class Solution {
    public boolean isHappy(int n) {
        // 将每次计算得到的数加入到 set1 中
        Set<Integer> set1 = new HashSet<>();
        while (n != 1) { // 若 n = 1,说明原始的数是快乐数
            if (set1.contains(n)) { // 若 n 已存在 set1 中,出现循环,返回 false
                return false;
            } else {
                set1.add(n);
                n = getSum(n);
            }
        }

        return true;
    }

    // 返回整数 n 各位数字的平方和
    public int getSum(int n) {
        int sum = 0;
        while (n != 0) {
            sum += Math.pow(n % 10, 2);
            n /= 10;
        }
        return sum;
    }
}

待解决
本题解法时间复杂度的计算:
image

快慢指针

思路
如果不是快乐数,一定出现循环,将计算得出的每个数连接起来,形成一个环形链表。
初始,slow = n,fast = getNextNum(n)。
每次循环,slow = getNextNum(slow) 走一步,fast = getNextNum(getNextNum(fast)) 走两步,若 slow = fast ,存在环,返回 false。
fast = 1,退出循环,返回 true。

class Solution {
   public boolean isHappy(int n) {
        int slow = n;
        int fast = getNext(n);
        while (fast != 1 && fast != slow) {
            slow = getNext(slow);
            fast = getNext(getNext(fast));
        }
        return fast == 1;
    }

    public int getNext(int n ) {
        int totalSum = 0;
        while (n > 0) {
            int d = n % 10;
            n = n / 10;
            totalSum += d * d;
        }
        return totalSum;
    }
}
posted @ 2025-10-18 14:53  Nickey103  阅读(2)  评论(0)    收藏  举报