快乐数
编写一个算法来判断一个数 n
是不是快乐数。 「快乐数」 定义为:
- 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
- 然后重复这个过程直到这个数变为 1,也可能是
无限循环
但始终变不到 1。 - 如果这个过程 结果为 1,那么这个数就是快乐数。
- 如果 n 是 快乐数 就返回 true ;不是,则返回 false 。
示例 1:
输入:n = 19
输出:true
解释:
121^212+929^292 = 82
828^282 + 222^222 = 68
626^262 + 828^282 = 100
121^212 + 020^202 + 020^202 = 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
。