题目介绍
编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」定义为:
对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。 如果 可以变为 1,那么这个数就是快乐数。 如果 n 是快乐数就返回 true ;不是,则返回 false 。
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/ha… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
1.根据题意,如果循环计算可以得出,每个位置的的数字平方之后的和是1就是快乐数,反正就会进入到无限循环中 2.如果是无限循环该如果跳出,可以用个set对象保存每次结算结果,如果结果出现过说明是循环过了,跳出循环 3.为了降低算法的空间复杂度我们也可以用快慢来解决
function getNext(n) {
return String(n).split('').map(i => i ** 2).reduce((a, b) => a + b)
}
// 通过set对象标记的方法
function isHappy2(n) {
let res = getNext(n)
let set = new Set()
set.add(res)
while (res !== 1) {
res = getNext(res)
if (set.has(res)) return false
set.add(res)
}
return res === 1
};
// 快慢指针
function isHappy(n) {
let slow = n
let fast = getNext(n)
if (slow !== 1 && slow !== fast) {
slow = getNext(n)
fast = getNext(getNext(n))
}
return slow === 1
}