手撕LeetCode—202 快乐数

写一个算法来判断一个数是不是“快乐数”。

一个数是不是快乐是这么定义的:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,或是无限循环但始终变不到 1。如果可以变为 1,那么这个数就是快乐数。

案例: 19 是一个快乐数。

  • 12 + 92 = 82
  • 82 + 22 = 68
  • 62 + 82 = 100

  • 12 + 02 + 02 = 1

最开始的想法,出现无限循环报异常就说明该数不是快乐数,那么用java的异常捕获try...catch...语句来返回false即可。

但是这样处理耗时太长。


应该没有人会像我这样写的吧,这样似乎太蠢了,不开心尴尬

public boolean isHappy(int n){
    if(n<=0){
        return false;
    }
    int temp = n;
    int res = 0;
    try{
        while(temp%10!=0||temp/10!=0){
            res += Math.pow(temp%10,2);
            temp = (temp-temp%10)/10;
        }
        if(res!=1){
            boolean flag = isHappy(res);
            return flag;
        }
        return true;
    }catch (StackOverflowError e){
        return false;
    }
}

怀着追求完美的心,我好好研究了一下快乐数,终于发现:个位数中只有两个快乐数,那就是1和7(看来单身的人快乐的真的是不多啊大哭)。于是就有了一下的解法(对之前的写法也做了优化)。

public boolean isHappy(int n) {
    while (n == 7 || n >= 10) {
        int t = 0;
        while (n != 0) {
            t += Math.pow((n % 10), 2);
            n /= 10;
        }
        n = t;
    }
    return n == 1;
}




猜你喜欢

转载自blog.csdn.net/big_data1/article/details/80055568