title

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

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

示例: 

输入: 19
输出: true
解释:
1^2 + 9^2 = 82
8^2 + 2^2 = 68
6^2 + 8^2 = 100
1^2 + 0^2 + 0^2 = 1

题解

  • 使用字典 Map 来记录循环过程中各个位置上的数字的平方和
    • 若平方和的值为 1, 则跳出循环, 这个数是快乐数;
    • 若平方和的值不为 1, 则判断字典 Map 中是否已有该值;
      • 若字典 Map 中已有该值, 则这个数不是快乐数;
/**
 * @param {number} n
 * @return {boolean}
 */
var isHappy = function(n) {
  const mapResult = new Map()

  let currentSum = getSum(n)
  while (currentSum !== 1) {
    const getMapResult = mapResult.get(currentSum)
    if (!getMapResult) {
      mapResult.set(currentSum, 1)
    } else {
      return false
    }
    currentSum = getSum(currentSum)
  }
  return true
}

/* 获取数字各个位数之和 */
var getSum = function(num) {
  let sum = 0
  const numStr = String(num)
  for (let i = 0; i < numStr.length; i++) {
    sum = sum + Math.pow(numStr[i], 2)
  }
  return sum
}

相关题目

205、242、290、349、350、451