Leetcode-刷题-自除数

280 阅读1分钟

题目内容描述

image.png

解题思路

根据题目内容描述,自除数,首先不允许包含0,其次对自身的每一位求余都为0。 我的思路是首先将数字转成字符串,然后遍历字符串中的每一位字符,转成数字,判断是否为0,不为0的话则进行求余操作,判断结果是否为0,所有字符循环完成后均为0,那么这个数就为自除数。

解题结果

class Solution {
    public List<Integer> selfDividingNumbers(int left, int right) {
            List<Integer> result = new ArrayList();
            for(int begin = left;begin<=right;begin++){
                String beginStr = String.valueOf(begin);

                boolean zichu = true;
                for(int i=0;i<beginStr.length();i++){
                    int temp = Integer.parseInt(String.valueOf(beginStr.charAt(i)));
                    if(temp == 0 || begin % temp != 0){
                        zichu = false;
                        break;
                    }
                }
                if(zichu){
                    result.add(begin);
                }
            }
            return result;
    }
}

执行性能

执行用时:8 ms, 在所有 Java 提交中击败了6.01%的用户

内存消耗:41.6 MB, 在所有 Java 提交中击败了5.05%的用户

通过测试用例:31 / 31

整体上来说,解题方式没问题,结果是对的,但是方式并不是最优的。

官方解法

遍历整数的每一位的方法是,每次将当前整数对 10取模即可得到当前整数的最后一位,然后将整数除以 10。重复该操作,直到当前整数变成 0时即遍历了整数的每一位。跟官方解法相比,我的方法多了一部分从int转string再转int的过程,所以用时和内存消耗都会多。

执行性能:

执行用时:1 ms, 在所有 Java 提交中击败了98.77%的用户

内存消耗:38.8 MB, 在所有 Java 提交中击败了95.36%的用户

通过测试用例:31 / 31

class Solution {
    public List<Integer> selfDividingNumbers(int left, int right) {
        List<Integer> ans = new ArrayList<Integer>();
        for (int i = left; i <= right; i++) {
            if (isSelfDividing(i)) {
                ans.add(i);
            }
        }
        return ans;
    }

    public boolean isSelfDividing(int num) {
        int temp = num;
        while (temp > 0) {
            int digit = temp % 10;
            if (digit == 0 || num % digit != 0) {
                return false;
            }
            temp /= 10;
        }
        return true;
    }
}