题目
编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」定义为:
对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。 如果 可以变为 1,那么这个数就是快乐数。 如果 n 是快乐数就返回 true ;不是,则返回 false 。
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/ha…
解题思路
假设每个数字的平方和为一组链表,如过存在环形链表,则表明这个数有可能是快乐数,如果环形链表的相交点为1,那么这个数一定是快乐数了。所以利用快慢指针原理求相交点即可
leetCode:
/**
* @param {number} n
* @return {boolean}
*/
var isHappy = function(n) {
var p1 = p2 = n;
do {
p1 = getSum(p1);
p2 = getSum(getSum(p2));
} while (p1 !== p2);
return p1 === 1; // 相交点为1, 则是快乐数,否则不是
};
/**
* @param {number} n
* @return {number} sum
*/
function getSum(n) {
var sum = 0;
while(n > 0) {
var s = n % 10;
sum += s * s;
n = Math.floor(n / 10);
}
return sum;
}