快乐数(202. 快乐数)

题目:

思路:

【1】本质上快乐数就是某个数的,各个位上的数的平方相加的到的是1就是快乐数【而且重复这个动作,最终得到的是1的也是快乐数】,而这个过程存在循环也就是会存在重复的数字进行重样的步骤,所以考虑到破解循环,一般要对数字进行记录,这便是比较常规的做法。

【2】但是又有一种更快的方式,就是用空间换时间,毕竟任何数算到最后都会得到一个100以内的数。

代码展示:

常规做法:

class Solution {
    public boolean isHappy(int n) {
        Set<Integer> set = new HashSet<>();
        while (n != 1) {
            int sum = 0;
            while (n != 0) {
                sum += (n % 10)*(n % 10);
                n /= 10;
            }
            if (!set.add(sum)) {
                return false;
            }
            n = sum;
        }
        return true;
    }
}

 

以空间换时间的方法【本质上任何数算到最后都会得到一个100以内的数,所以不妨把100以内的快乐数列个表【耗费一定的存储空间,以达到很快速查找】,然后进行查表】:

class Solution {
    public boolean isHappy(int n) {
        int[] h = new int[101];
        h[1] = 1;
        h[7] = 1;
        h[10] = 1;
        h[13] = 1;
        h[19] = 1;
        h[23] = 1;
        h[28] = 1;
        h[31] = 1;
        h[32] = 1;
        h[44] = 1;
        h[49] = 1;
        h[68] = 1;
        h[70] = 1;
        h[79] = 1;
        h[82] = 1;
        h[86] = 1;
        h[91] = 1;
        h[94] = 1;
        h[97] = 1;
        h[100] = 1;
        int n0 = 0;
        while(n > 100){
            while(n != 0){
                n0 += (n % 10) * (n % 10);
                n /= 10;
            }
            n = n0;
            n0 = 0;
        }
        if(h[n] == 1) {
            return true;
        }
        return false;
    }
}

 

posted @ 2023-01-07 19:53  忧愁的chafry  阅读(184)  评论(0编辑  收藏  举报