[路飞]_快乐数

198 阅读1分钟

题目介绍

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

「快乐数」定义为:

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

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/ha… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

1.根据题意,如果循环计算可以得出,每个位置的的数字平方之后的和是1就是快乐数,反正就会进入到无限循环中 2.如果是无限循环该如果跳出,可以用个set对象保存每次结算结果,如果结果出现过说明是循环过了,跳出循环 3.为了降低算法的空间复杂度我们也可以用快慢来解决

    function getNext(n) {
      return String(n).split('').map(i => i ** 2).reduce((a, b) => a + b)
    }
    // 通过set对象标记的方法
    function isHappy2(n) {
      let res = getNext(n)
      let set = new Set()
      set.add(res)
      while (res !== 1) {
          res = getNext(res)
          if (set.has(res)) return false

          set.add(res)
      }
      return res === 1
    };
    // 快慢指针
    function isHappy(n) {
      let slow = n
      let fast = getNext(n)
      if (slow !== 1 && slow !== fast) {
        slow = getNext(n)
        fast = getNext(getNext(n))
      }
      return slow === 1
    }