2021年3月

首先找到 LeetCode 202 题

「快乐数」定义为:

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

简单抽象一下:因为每一次计算都唯一指向下一个结果,所以这是一个类似链表的结构。

又因为不是”快乐数“会出现无限循环,所以这个判断”快乐数“就变成了判断”链表是否有环“。

简单用快慢指针判断,如果有环,慢指针一定会追上快指针。

然后一个循环求和就完事了。

// 字符串转字符数组
function nta(n) {
  return n.toString().split("");
}

// 数字每一位的平方和(链表下一位)
function next(n) {
  let src = 0;
  nta(n).map((i) => {
    src = src + i * i;
  });
  return src;
}

// 判断是否是快乐数(是否有环)
const isHappy = function (n) {
  let m = next(n);
  let k = next(m);
  while (k !== m && m !== 1) {
    m = next(m);
    k = next(next(k));
  }
  return m === 1;
};

// 然后一个循环求和就完事了
let res = 0;
for (let i = 1; i <= 100000; i++) {
  if (isHappy(i)) {
    res = res + i;
  }
}
console.log(res);