持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情
有人相爱,有人夜里开车看海,我是leetcode第一题都做不出来
国庆到了,学习一下快乐数吧
这是LeetCode的第202题:快乐数
快乐数
编写一个算法来判断一个数 n
是不是快乐数。
「快乐数」 定义为:
- 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
- 然后重复这个过程直到这个数变为 1,也可能是
无限循环
但始终变不到 1。 - 如果这个过程 结果为 1,那么这个数就是快乐数。
- 如果 n 是 快乐数 就返回 true ;不是,则返回 false 。
示例 1:
输入:n = 19
输出:true
解释:
+ = 82
+ = 68
+ = 100
+ + = 1
示例 2:
输入:n = 2
输出:false
解题思路
根据题意可以知道有两种情况
- n==1
- 陷入无限循环
我们要做的就是把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
};
知识点
-
Set
对象允许你存储任何类型的唯一值,它是值的集合,你可以按照插入的顺序迭代它的元素。Set 中的元素只会出现一次,即 Set 中的元素是唯一的。 -
Math.pow(base,exponent)
函数返回基数(base
)的指数(exponent
)次幂,即base^exponent
。