题目
编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」定义为:
对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。 如果 可以变为 1,那么这个数就是快乐数。 如果 n 是快乐数就返回 true ;不是,则返回 false 。
解题
使用快慢指针,原理:如果遍历到重复的节点,那么说明就有环,那么就不是快乐数,那么为什么会重复,因为1999999999是平方相加后最大的数,也就是730。2147483647也不会大于 730;所以肯定会重复。
/**
* @param {number} n
* @return {boolean}
*/
function getNext(x){
let z = 0;
while(x !== 0){
z += Math.floor(x % 10) * Math.floor(x % 10)
x /= 10
}
return z
}
// 用环形链表解决这个问题
// 如果遍历到重复的节点,那么说明就有环,那么就不是快乐数
// 为什么会重复,因为1999999999是平方相加后最大的数,也就是730。2147483647也不会大于 730;所以肯定会重复
var isHappy = function(n) {
let p = n; // 快指针
let q = n; // 慢指针
do{
p = getNext(getNext(p));
q = getNext(q);
} while(p !== q && q!==1)
return q === 1
};
\