【算法】求快乐数——快不快乐都要记下来

今天记一道题昂。是力口的
连接:https://leetcode-cn.com/probl...算法

反正就是呢有些数它是快乐的,你也不知道为啥,举个栗子:微信

输入:19
输出:true
解释:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1

定义是:
一个正整数,每一次将该数替换为它每一个位置上的数字的平方和,而后重复这个过程直到这个数变为 1,也多是 无限循环 但始终变不到 1。若是 能够变为  1,那么这个数就是快乐数app


来直接上答案,思路在注视里本身看昂:函数

/**
 * @param {number} n
 * @return {boolean}
 */
var happyMap = {};//全局记录一下快乐过的数
var unHappyMap = {};//也记录一下不快乐的数
var bro = {};//预备一个循环中要记录的当前循环数及衍生数的集合
var _getSum = function(num){
    var arr = (num+'').split('');
    var _sum  = 0;
    for(let i =0;i<arr.length;i++){
        _sum += Math.pow(arr[i],2)
    }

    if(_sum === 1){ //若是是1,直接返回true
        bro[num] = 1; //并将1记录下来~
        return true;
    }else if(bro[_sum]){ //若是是和当前循环的衍生数中某一个数撞上了,那么就是个死循环了,马上返回false
        return false;
    }else if(happyMap[_sum]){ //若是是被记录为快乐数,则直接返回true
        return true;
    }else if(unHappyMap[_sum]){ //若是记录中不快乐,就返回false
        return false;
    }else{ //若是是个新的数,那就将它暂存在循环衍生map中
        bro[num] = 1;
        return _getSum(_sum);
    }
}
var isHappy = function(n) {
    bro = {}; //每一次新的循环,清空一次循环衍生数map
    var _flag = _getSum(n); //执行一次求和函数
    if(_flag){
        //若是是快乐的,那么此次衍生出的全部数都是快乐的,记录下来!
        for(let i in bro){
            happyMap[i] = true;
        }
    }else{
        //同理,若是只要结果不快乐,那过程都记到不快乐吧
        for(let i in bro){
            unHappyMap[i] = true;
        }
    }
    return _flag;
};

微信截图_20200501002417.png
反正就是还有好多好多思路,反正就是这个算法的速度贼快,且占用内存贼少(战胜了辣么多的人,不知道咋算的,反正是厉害昂,偷笑hhhhhh)
来,原答案在这里:
https://leetcode-cn.com/probl...spa