/**
* @param {number} n
* @return {boolean}
*/letgetNext=function(n){return n.toString().split('').map(i=> i **2).reduce((a, b)=> a + b);}letisHappy=function(n){let seen =newSet();while(n !==1&&!seen.has(n)){
seen.add(n);
n =getNext(n);}return n ===1;};
方法二:快慢指针
/**
* @param {number} n
* @return {boolean}
*/letgetNext=function(n){return n.toString().split('').map(i=> i **2).reduce((a, b)=> a + b);}letisHappy=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 =newSet([4,16,37,58,89,145,42,20]);letgetNext=function(n){return n.toString().split('').map(i=> i **2).reduce((a, b)=> a + b);}letisHappy=function(n){while( n !==1&&!cycleMembers.has(n)){
n =getNext(n);}return n ===1;};