题目:728.自除数

题目来源:

        leetcode题目,网址:728. 自除数 - 力扣(LeetCode)

解题思路:

       使用静态变量存放已经判断过是自除数的数字,因为所给区间是连续的,所以存放的一定连续区间内的自除数。

       求给定范围内的自除数,若静态变量 list 为空,逐个判断给定范围内的数字是否是自除数并将其中的自除数添加到 list 中;若 list 非空,判断所给范围是否已经判断过了,若没有,对未判断过的范围内数字逐个判断。最后遍历 list ,寻找所给范围内自除数。

解题代码:

class Solution {
    static List<Integer> list;
    public List<Integer> selfDividingNumbers(int left, int right) {
        if(list==null){
            list=new ArrayList<Integer>();
            tailAdd(left,right);
            return list;
        }
        List<Integer> res=new ArrayList<>();
        if( left < list.get(0) ){
            headAdd(left,list.get(0)-1);
        }
        if(right>list.get(list.size()-1)){
            tailAdd(list.get(list.size()-1)+1,right);
        }
        for(int num:list){
            if(num>=left && num<=right){
                res.add(num);
            }
        }


        return res;
    }
    public void tailAdd(int left,int right){//尾部添加元素,闭区间
        while(left<=right){
            if(judgeNum(left)){
                list.add(left);
            }
            left++;
        }
    }
    public void headAdd(int left,int right){//从头开始添加,闭区间
        while(left<=right){
            if(judgeNum(right)){
                list.add(0,right);
            }
            right--;
        }
    }
    public boolean judgeNum(int num){
        boolean res=true;
        int temp=num;
        while(temp!=0){
            int place=temp%10;
            if(place==0 ||  num%place!=0 ){
                res=false;
                break;
            }
            temp=temp/10;
        }
        return res;
    }

}
 

总结:

        在 list 中查找所给区间内自除数时可以使用二分查找提高效率。

        官方题解给出暴力解法。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值