LeetCode快乐数使用JavaScript解题|前端学算法

2,160 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情

有人相爱,有人夜里开车看海,我是leetcode第一题都做不出来

国庆到了,学习一下快乐数吧

这是LeetCode的第202题:快乐数

快乐数

编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为:

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

示例 1:

输入:n = 19

输出:true

解释:

121^2+929^2 = 82

828^2 + 222^2 = 68

626^2 + 828^2 = 100

121^2 + 020^2 + 020^2 = 1

示例 2:

输入:n = 2

输出:false

解题思路

根据题意可以知道有两种情况

  1. n==1
  2. 陷入无限循环

我们要做的就是把n拆解,让个位、十位、百位上的数进行平方相加,得到一个新值sum ,如果sum等于1那就是快乐数,如果sum没有出现过,那就继续拆解sum,如果sum跟之前的n有重复(sum出现过)那就是陷入了无限循环

具体操作可以拆解为如下步骤:

  • 第一步:初始化一个sum让其等于每个位置上的数字的平方和;初始化一个Set数据结构,用来存放 sum;

  • 第二步:如果n不等于1,则进入循环

  • 第三步:循环体内判断set内有没有n,如果有,说明进入了 无限循环 ,始终变不到 1;此时中断循环,返回false

  • 第四步: 如果set内没有n,就把n添加到set内,并让等于每个位置上的数字的平方和,让n=sum进行第二步

  • 第五步:判断n是否等于1,并返回结果;如果是快乐数,n=1

var isHappy = function(n) {
    let set = new Set()
    let sum = 0
    while(n !== 1){
        if(set.has(n)){
            // 已经有n了就说明开始无限循环了
            return false
        }else{
            set.add(n)
            sum = 0
            while(n>0){
                // 每个位置上的数字的平方 相加
                sum+=Math.pow(n%10,2)
                n = Math.floor(n/10)
            }
            n = sum
        }
    }
    return n === 1
};

image.png

知识点

  • Set 对象允许你存储任何类型的唯一值,它是值的集合,你可以按照插入的顺序迭代它的元素。Set 中的元素只会出现一次,即 Set 中的元素是唯一的。

  • Math.pow(base,exponent)  函数返回基数(base)的指数(exponent)次幂,即 base^exponent