快乐数

「快乐数」 定义为:

  • 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。

  • 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。

  • 如果这个过程 结果为 1,那么这个数就是快乐数。

  • 如果 n 是 快乐数 就返回 true ;不是,则返回 false 。

  • 输入:n = 19

  • 输出:true

  • 解释:

  • 1^2 + 9^2 = 82

  • 8^2 + 2^2 = 68

  • 6^2 + 8^2 = 100

  • 1^2 + 0^2 + 0^2 = 1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 可以想象一个对象的 val = n, next = n各个位数的平方和,依次类推,组成了一个链表
// 如果链表中产生了无限循环,那一定是链表中有环了
// 判断链表是否有环,使用快慢指针

const isHappy = (n) => {
let slow = n, fast = squareSum(n)
while (slow != fast) {
slow = squareSum(slow)
fast = squareSum(squareSum(fast))
}
return slow === 1
}

const squareSum = (n) => {
let sum = 0
while (n > 0) {
let digit = n % 10
sum += digit * digit
n = Math.floor(n / 10)
}
return sum
}