[路飞]快乐树

338 阅读1分钟

1. 快乐树算法

对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。

然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。

如果 可以变为  1,那么这个数就是快乐数。

如果能够判断出某次的数字平方和在之前的出现过,那就代表已经陷入无限循环当中,既不是一个快乐数。按此思路,判断快乐树,类似于判断链表是否有环,如果有环,则不是,反之则是快乐树。

1.1 利用类似快慢指针的方式判断

var isHappy = function(n) {
    let p = n; 
    let q = getValue(getValue(p));
    while(p !== 1 && p !== q) {
        p = getValue(p);
        q = getValue(getValue(q));
    }
    return q === 1

    function getValue(n) {
        let sum = 0;
        while(n) {
            sum += (n % 10) ** 2;
            n = Math.floor(n / 10);
        }
        return sum;
    };
};

1.2 利用Set判断

var isHappy = function(n) {
    const set = new Set();

    while(n !== 1 && !set.has(n)) {
        set.add(n);
        n = getValue(n);
    }

    return n === 1;

    function getValue(n) {
        let sum = 0;
        while(n) {
            sum += (n % 10) ** 2;
            n = Math.floor(n / 10);
        }
        return sum;
    };
};