[路飞]leetcode-202. 快乐数

127 阅读1分钟

题目描述

编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」定义为:

对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。 如果 可以变为  1,那么这个数就是快乐数。 如果 n 是快乐数就返回 true ;不是,则返回 false 。 力扣原文链接

快乐数定义

    输入: n = 19
    输出: true
    解释: 12 + 92 = 82
    82 + 22 = 68
    62 + 82 = 100
    12 + 02 + 02 = 1

//如何避免死循环 ,当某次的平方和再次出现时,意味着进入了死循环,这时可以使用快慢指针的思路或者哈希表的思路,就可以实现判断快乐数

求数字每一位的平方和

function getNext(num) {
    let sum = 0;
    while(num) {
        sum += (num%10) * (num%10)
        num = parseInt(num/10)
    }
    return sum;
}

快慢指针

var isHappy = function(n) {
    if(n==1 || getNext(n)==1) return true
    let slow = fast = n;
    while(fast && getNext(fast) && fast != 1)  {
        slow = getNext(slow)
        fast = getNext(getNext(fast))
        console.log(slow,fast)
        if(slow == fast) {
           
            return false
        }
    }
    return true
};

哈希表

var isHappy = function (n) {
  if (n == 1 || getNext(n) == 1) return true;
  let next = n;
  let seter = new Set();
  while (next != 1 && !seter.has(next)) {
    seter.add(next);
    next = getNext(next);
  }
  return next === 1;
};