202. Happy Number

26 年 3 月 5 日 星期四
352 字
2 分钟

202. Happy Number

Screenshot 2026-03-05 at 6.56.42 pm
js
/**
 * @param {number} n
 * @return {boolean}
 */
function isHappy(n) {
  // 接收一个数字,计算这个数字每一位上的数字的平方和,并返回这个平方和。
  function getNext(number) {
    let totalSum = 0 // 初始化平方和为0
    // 循环拆解数字的每一位(直到数字被拆解完,变为0)
    while (number > 0) {
      // 取当前数字的最后一位(余数)
      const digit = number % 10
      // 去掉最后一位,更新数字(整除10)
      number = Math.floor(number / 10)
      // 累加当前位的平方到总和中
      totalSum += digit * digit
    }
    // 返回计算得到的平方和
    return totalSum
  }

  // 慢指针:初始指向输入数字n,每次只走一步(计算一次平方和)
  let slowRunner = n
  // 快指针:初始指向n的下一个平方和,每次走两步(连续计算两次平方和)
  let fastRunner = getNext(n)

  // 循环条件:
  // 1. 快指针未到达1(到达1说明是快乐数,可终止循环)
  // 2. 慢指针和快指针未相遇(相遇说明进入循环,不是快乐数)
  while (fastRunner !== 1 && slowRunner !== fastRunner) {
    // 慢指针走一步:计算一次平方和
    slowRunner = getNext(slowRunner)
    // 快指针走两步:连续计算两次平方和
    fastRunner = getNext(getNext(fastRunner))
  }

  // 最终判断:如果快指针等于1,说明是快乐数;否则不是
  return fastRunner === 1
}

文章标题:202. Happy Number

文章作者:Sirui Chen

文章链接:https://blog.siruichen.me/posts/202_happy_number[复制]

最后修改时间:


商业转载请联系站长获得授权,非商业转载请注明本文出处及文章链接,您可以自由地在任何媒体以任何形式复制和分发作品,也可以修改和创作,但是分发衍生作品时必须采用相同的许可协议。
本文采用CC BY-NC-SA 4.0进行许可。