Leetcode:202快乐数

154 阅读2分钟

力扣题目链接

题意:

编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」定义为:

对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。 如果 可以变为  1,那么这个数就是快乐数。 如果 n 是快乐数就返回 true ;不是,则返回 false 。

image.png

思路(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
}