哈希表 - 快乐数

78 阅读1分钟

202. 快乐数

image.png

image.png

方法一:用哈希集合检测循环

/**
 * @param {number} n
 * @return {boolean}
 */

let getNext = function(n) {
    return n.toString().split('').map(i => i ** 2).reduce((a, b) => a + b);
}

let isHappy = function(n) {
    let seen = new Set();
    while (n !== 1 && !seen.has(n)) {
        seen.add(n);
        n = getNext(n);
    }
    return n === 1;
};

方法二:快慢指针

/**
 * @param {number} n
 * @return {boolean}
 */

let getNext = function(n) {
    return n.toString().split('').map(i => i ** 2).reduce((a, b) => a + b);
}

let isHappy = function(n) {
    let slow = n;
    let fast = getNext(n);
    while (fast !== 1 && fast !== slow) {
        slow = getNext(slow);
        fast = getNext(getNext(fast));
    }
    return fast === 1;
};

方法三:数学

/**
 * @param {number} n
 * @return {boolean}
 */
// 定义一个包含这些数字的散列集
let cycleMembers = new Set([4, 16, 37, 58, 89, 145, 42, 20]);

let getNext = function(n) {
    return n.toString().split('').map(i => i ** 2).reduce((a, b) => a + b);
}

let isHappy = function(n) {
    while ( n !==1 && !cycleMembers.has(n)) {
        n = getNext(n);
    }
    return n === 1;
};