LeetCode算法题-Self Dividing Numbers(Java实现)

这是悦乐书的第305次更新,第324篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第173题(顺位题号是728)。自分割数是一个可被其包含的每个数字整除的数字。例如,128是自分割数,因为128%1 == 0,128%2 == 0,128%8 == 0。此外,不允许自分割数包含数字零。给定数字的下限和上限,输出每个可能的自分割数的数组,如果可能,包括边界。例如:

输入:left = 1,right = 22

输出:[1,2,3,4,5,6,7,8,9,11,12,15,22]

注意:每个输入参数的边界是1 <= left <= right <= 10000。

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

此题要求找出给定范围内所有符合要求的自分割数,直接将题目意思翻译过来就行,单独写了一个判断是否是自分割数的判断方法。

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

public boolean isSelfDividing(int num){
    char[] arr = (num+"").toCharArray();
    for (char ch : arr) {
        if (ch == '0' || num%(ch-'0') != 0) {
            return false;
        }
    }
    return true;
}

03 第二种解法

我们也可以直接在一个方法里面完成,第一种解法是转成字符数组来判断,此解法是利用取余和整除结合来取每一位数。

public List<Integer> selfDividingNumbers(int left, int right) {
    List<Integer> list = new ArrayList<Integer>();
    for (int i=left; i<=right; i++) {
        int num = 0;
        for (num=i; num>0; num/=10) {
            if (num%10 == 0 || i%(num%10) != 0) {
                break;
            }
        }
        if (num == 0) {
            list.add(i);
        }
    }
    return list;
}

04 小结

算法专题目前已日更超过五个月,算法题文章173+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

posted @ 2019-04-13 23:28  程序员小川  阅读(347)  评论(0编辑  收藏  举报