创见博客
快乐数
七崽爱吃小饼干2026/01/05阅读 0专栏 算法合集

快乐数

编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」 定义为:

对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。 如果这个过程 结果为 1,那么这个数就是快乐数。 如果 n 是 快乐数 就返回 true ;不是,则返回 false 。

示例 1:

codeType
输入:n = 19
输出:true
解释:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1

示例 2:

codeType
输入:n = 2
输出:false

提示:

  • 1 <= n <= 231 - 1

解法:

是否是快乐数主要需要找到计算过程是否存在循环,就像深拷贝的循环引用,使用一个哈希表存储遍历过的数字即可。

ts
function isHappy(n: number): boolean {
    // 0-9的平方可以预先存储
    const sqrt = new Map<number, number>()
    for(let i = 0; i < 10; i ++){
        sqrt.set(i, i * i)
    }
    // 可以记录每次计算的结果,如果重复了,就说明循环了
    const record = new Map<number, boolean>()
    while(n !== 1){
        let res = 0
        let i = 10, j = 1
        while(j <= n){
            const num = Math.floor((n % i) / j) // 从第一位开始取
            res += sqrt.get(num)
            i = i * 10
            j = j * 10
        }
        n = res
        if(record.has(n)){
            return false // 出现重复结果
        }else{
            record.set(n, true)
        }
    }
    return true
};

解法二是通过快慢指针解答,快指针移动两次,慢指针移动一次,如果存在循环,那么两者早晚会遇到。

评论
0/100