快乐数
描述
- 编写一个算法来判断一个数 n 是不是快乐数
- 「快乐数」 定义为:
- 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和
- 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1
- 如果这个过程 结果为 1,那么这个数就是快乐数
- 如果 n 是 快乐数 就返回 true ;不是,则返回 false
示例 1
输入:n = 19
输出:true
解释:
1
2
+
9
2
=
82
1^2 + 9^2 = 82
12+92=82
8
2
+
2
2
=
68
8^2 + 2^2 = 68
82+22=68
6
2
+
8
2
=
100
6^2 + 8^2 = 100
62+82=100
1
2
+
0
2
+
0
2
=
1
1^2 + 0^2 + 0^2 = 1
12+02+02=1
示例 2
输入:n = 2
输出:false
提示
- 1 <= n <= 2 31 2^{31} 231 - 1
Typescript 版算法实现
1 ) 方案:快慢指针
function bitSquareSum(n: number): number {
let sum = 0;
while (n > 0) {
const bit = n % 10;
sum += bit * bit;
n = Math.floor(n / 10);
}
return sum;
}
function isHappy(n: number): boolean {
let slow = n;
let fast = n;
do {
slow = bitSquareSum(slow);
fast = bitSquareSum(fast);
fast = bitSquareSum(fast);
} while (slow !== fast);
return slow === 1;
}
2 ) 方案2:字典
function getNum(n: number): number {
let sum = 0
while (n) {
sum += (n % 10) ** 2
n = Math.floor(n / 10)
}
return sum
}
function isHappy(n: number): boolean {
const obj = {}
// let map = new Map()
while (true) {
if (n in obj) return false
if (n == 1) return true
obj[n] = true
n = getNum(n)
}
};