题意:
编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」定义为:
对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。 如果 可以变为 1,那么这个数就是快乐数。 如果 n 是快乐数就返回 true ;不是,则返回 false 。
思路(leetcode官方):
算法分为两个部分:
- 给一个数字n,它的下一个数字是什么?(定义一个getSum函数)
- 将数字n进行分离,n%10可逐个得到最末尾的位数,并将其平方
- 用一个sum来接收平方的和,再用n/10来去掉n的末尾数字,来得到倒数第二位的数字
- 重复上述步骤,直到数字n的每一位都被分离计算,返回sum
- 按照一系列的数字来判断我们是否进入了一个循环
- 每次都根据上一步函数得到的数,检查它是否已经在集合中
- 若它不在集合中,我们就把它添加进去
- 若它在集合中,则说明我们处于一个循环,应该返回false
/**
* @param {number} n
* @return {boolean}
*/
//定义求和函数,用来计算出下一个要拆开并平方和的数
var getSum = function(n){
let sum = 0
while(n){
sum = sum+(n%10)**2
n = Math.floor(n/10)
}
return sum
}
//134 134%10 = 4 sum = 0+4^2=8
//n=134/10=13 sum=8+(13%10)^2 = 8+6 =14
//n=13/10=1 sum=14+1^2=15
//n = 0 return 15
//计算完一个数各位对应的平方并求和
//判断是否为快乐数
var isHappy = function(n){
let set = new Set()
while(n!==1 && !set.has(n)){
set.add(n)
n=getSum(n)
}
return n ===1
}