Leetcode
Leetcode copied to clipboard
202. 快乐数
编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」 定义为:
对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。 如果这个过程 结果为 1,那么这个数就是快乐数。 如果 n 是 快乐数 就返回 true ;不是,则返回 false 。
示例 1: 输入:n = 19 输出:true
解释: 12 + 92 = 82 82 + 22 = 68 62 + 82 = 100 12 + 02 + 02 = 1
示例 2: 输入:n = 2 输出:false 提示:
1 <= n <= 231 - 1
/**
* @param {number} n
* @return {boolean}
202. 快乐数
当它最后是快乐数,最后是能够得到1这个值的
1这个值就相当链表的尾节点就一个空节点
如果不是快乐数 说明它会一直的去 在某一个数
通过计算之后会等于前面的某一个数
这样的话它才会 一直的循环下去形成闭环
*/
var isHappy = function(n) {
// 1 <= n so 等于1的话它就是一个快乐数
if(n === 1) return true
// 首先我们定义一个map结构
let mapper = new Map()
let p = getNext(n)
// 如果p不等于1的话
while(p !== 1) {
if(!mapper.has(p)) {
mapper.set(p, p)
p = getNext(p)
} else {
return false
}
}
// 跳出循环的时候
// 走到了最后一个节点也就是为1
return true
};
// 获取它的下一个节点
var getNext = function(n) {
let sum = 0
while(n) {
// 计算的话我们从它的末位开始去 平方和相加
sum += (n % 10) ** 2 // 9
// 把n赋值为就是把它的个位数砍掉
n = Math.floor(n / 10) // 1
}
// 计算完成之后,我们再把和返回出来
return sum
}
/**
* @param {number} n
* @return {boolean}
202. 快乐数
快慢指针的方法
*/
var isHappy = function(n) {
// 第一步判断n是不是等于1
if(n === 1) return true
// 定义两个指针,一个每次走一步
let p = getNext(n)
// 一个每次走两步
let q = getNext(getNext(n))
// 循环条件
while(p !== q && q !== 1) {
p = getNext(p)
q = getNext(getNext(q))
}
return q === 1
};
// 获取它的下一个节点
var getNext = function(n) {
let sum = 0
while(n) {
// 计算的话我们从它的末位开始去 平方和相加
sum += (n % 10) ** 2 // 9
// 把n赋值为就是把它的个位数砍掉
n = Math.floor(n / 10) // 1
}
// 计算完成之后,我们再把和返回出来
return sum
}