求[0, 100000]内所有快乐数(定义参考LeetCode #202)的和
首先找到 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);