题目:
题目链接:
题解:
方法一:哈希表
首先就是何种情况下不是快乐数,那就是处理过的结果多次重复出现的情况,那这里就可以通过哈希表在每次循环中存储处理后的结果,如果处理后的结果在哈希表中查找的到说明结果重复说明该数不是快乐数,退出循环即可,否则一直循环到处理结果为1。
var isHappy = function(n) {
let set = new Set()
while(1){
// 分割字符串,将每个结果存储在数组中
let arr = String(n).split("")
// 将该数替换为它每个位置上的数字的平方和
arr = arr.map(item=>{
return item * item
})
// 求和
n = arr.reduce((pre,cur)=>{
return (pre+cur)
},0)
//各种情况判断
if(n == 1){
return true
}else if(set.has(n)){
return false
}else{
set.add(n)
}
}
};
方法二:快慢指针
为了降低空间复杂度,我们放弃使用哈希表,我们选择使用快慢指针来解决,流程如下:
-
创建一个慢指针,一次走一步,再创建一个快指针,一次走两步。
-
当快慢指针相遇,代表形参环路,该数不是快乐数。
-
若指针移动过程中,找到了 1,则当前数是一个快乐数
// 通过findRes放回处理一次的结果
function findRes(n){
// 分割字符串,将每个结果存储在数组中
let arr = String(n).split("")
// 将该数替换为它每个位置上的数字的平方和
arr = arr.map(item=>{
return item * item
})
// 求和
n = arr.reduce((pre,cur)=>{
return (pre+cur)
},0)
return n
}
// 主函数
var isHappy = function(n) {
//设置快慢指针
let slow = n
let fast = findRes(n)
// 当false == slow,说明陷入环中,不可能是快乐数
while(fast!=1 && fast != slow){
slow = findRes(slow)
fast = findRes(findRes(fast))
}
return fast == 1
};