思路
将n为链表的表头,后面位数的平方和未其next 如果是无限循环那么必定会相遇
代码
let isHappy = function (n) {
let p1 = n;
let p2 = getNext(n);//遇到10的n次方就会五险循环下去,故从next开始而不是n
while (p2 !== 1) {
p1 = getNext(p1);
p2 = getNext(getNext(p2));
//如果是个环那么说明是无限循环
if (p1 === p2) {
return false;
}
}
return p2 === 1;
}
let getNext = function (n) {
let sum = 0;
while (n > 0) {
sum += Math.pow(n % 10, 2);
n = Math.floor(n / 10);
}
return sum;
}
复杂度
时间:O(n)
空间: O(n);函数套函数