力扣202:快乐数

192 阅读1分钟

题目

编写一个算法来判断一个数 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;
}