解题方法一
如果能够判断出n的数字平方和在之前出现过,那就代表陷入无限循环中,既不是一个快乐数,这里使用Set来记录这个判断是否出现重复值
var isHappy = function(n) {
const record = new Set()
while(n !== 1 && !record.has(n)) {
record.add(n)
n = getNext(n)
}
return n === 1
};
var getNext = function(n) {
let sum = 0
while(n) {
sum += (n%10) ** 2
n = Math.floor(n/ 10)
}
return sum
}
解题方法二
使用类似快慢指针来判断是否有重复值
var isHappy = function(n) {
let slow = n
let fast = getNext(n)
while ( fast !== slow && fast !== 1) {
slow = getNext(slow)
fast = getNext(getNext(fast))
}
return fast === 1
};
var getNext = function(n) {
return n.toString().split('').map(el => parseInt(el) ** 2).reduce((a,b) => a + b)
}