【路飞】leetcode 202 快乐数

116 阅读1分钟

解法一: 哈希加循环发

思路:循环遍历每次生成的数,将之加入set中,如果set中第二次出现该节点,则表示进入无限循环,返回false,否则判断是否值是否为1

var isHappy = function(n) {
    if (n === 0) return false
    if (n === 1) return true
    let a = null
    let set = new Set()
    do {
        if (set.has(n)) return false
        set.add(n)
        a = sumHandler(n)
    } while ((n = a) !== 1)
    return true
};

function sumHandler (n) {
    
    return n.toString().split('').map(item => item * item).reduce((pre, cur) => (pre  + cur))
}

解法二: 快慢指针

思路:参考链表有环,如果快指针追上慢指针,则表示进入循环,返回false, 因快指针追上慢指针进入无限循环,则循环时需要判断不能相等,所以快指针先行一步

var isHappy = function(n) {
    let slow = n;
    let fast = sumHandler(n); // 先走一步,否则无法进入循环
    while(fast !== 1 && fast !== slow){
        slow = sumHandler(slow);
        fast = sumHandler(sumHandler(fast));
    }
    return fast === 1;
};

function sumHandler (n) {
    return n.toString().split('').map(item => item * item).reduce((pre, cur) => (pre  + cur))
}