202. 快乐数


方法一:用哈希集合检测循环
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;
};
方法二:快慢指针
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;
};
方法三:数学
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;
};