编写一个算法判断一个数n是不是快乐数。
快乐数定义为:
对于一个正整数。每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为1,也可能是无线循环始终变不到1。
如果可以变为1,那么这个数就是快乐数。如果n是快乐数,就返回true,不是则返回false。
思路:用一个空间存储所得到的平方和,可能会出现三种情况
- 平方和为1
- 出现重复的数字,这个数不是
- 数字会趋于无穷大
如果出现重复的数字,则表示出现循环,这个数就不是。
对于第三种情况,对于3位的数字,不可能大于243,要么被困在243以内的循环内,要么跌倒11,4位或4位以上的数字在每一步都会丢失一位,然后降到 3 位为止。最坏的情况下,算法可能会再243以下的所有数字上循环,然后回到它已经经过的一个循环或者回到1,不会无限进行下去。
- 时间复杂度 O(logN),空间复杂度O(1)
- Runtime: 80 ms, faster than 71.27%
- Memory Usage: 41 MB, less than 25.18%
/**
* @param {number} n
* @return {boolean}
*/
var isHappy = function(n) {
let set = new Set();
while (true) {
let s = String(n);
let cur = 0;
for (let item of s) {
cur += item * item;
}
if (cur === 1) {
return true;
}
n = cur;
if (set.has(n)) {
return false;
}
set.add(n);
}
};
网友评论