哈希表 - 快乐数

202. 快乐数

在这里插入图片描述

在这里插入图片描述

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

/**
 * @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;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值