快乐数
编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」 定义为:
对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。 如果这个过程 结果为 1,那么这个数就是快乐数。 如果 n 是 快乐数 就返回 true ;不是,则返回 false 。
示例 1:
codeType
输入:n = 19
输出:true
解释:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1
示例 2:
codeType
输入:n = 2
输出:false
提示:
- 1 <= n <= 231 - 1
解法:
是否是快乐数主要需要找到计算过程是否存在循环,就像深拷贝的循环引用,使用一个哈希表存储遍历过的数字即可。
ts
function isHappy(n: number): boolean {
// 0-9的平方可以预先存储
const sqrt = new Map<number, number>()
for(let i = 0; i < 10; i ++){
sqrt.set(i, i * i)
}
// 可以记录每次计算的结果,如果重复了,就说明循环了
const record = new Map<number, boolean>()
while(n !== 1){
let res = 0
let i = 10, j = 1
while(j <= n){
const num = Math.floor((n % i) / j) // 从第一位开始取
res += sqrt.get(num)
i = i * 10
j = j * 10
}
n = res
if(record.has(n)){
return false // 出现重复结果
}else{
record.set(n, true)
}
}
return true
};
解法二是通过快慢指针解答,快指针移动两次,慢指针移动一次,如果存在循环,那么两者早晚会遇到。
