解法一: 哈希加循环发
思路:循环遍历每次生成的数,将之加入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))
}