Leetcode-202-快乐数

127 阅读1分钟

题目

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

「快乐数」定义为:

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

解题

使用快慢指针,原理:如果遍历到重复的节点,那么说明就有环,那么就不是快乐数,那么为什么会重复,因为1999999999是平方相加后最大的数,也就是730。2147483647也不会大于 730;所以肯定会重复。

/**
 * @param {number} n
 * @return {boolean}
 */function getNext(x){
    let z = 0;
    while(x !== 0){
        z += Math.floor(x % 10) *  Math.floor(x % 10)
        x /= 10
    }
    return z 
 }
​
// 用环形链表解决这个问题
// 如果遍历到重复的节点,那么说明就有环,那么就不是快乐数
// 为什么会重复,因为1999999999是平方相加后最大的数,也就是730。2147483647也不会大于 730;所以肯定会重复
var isHappy = function(n) {
    let p = n; // 快指针
    let q = n; // 慢指针
    do{
        p = getNext(getNext(p));
        q = getNext(q);
    } while(p !== q && q!==1)
​
    return q === 1
};

\