题目来源:
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 中查找所给区间内自除数时可以使用二分查找提高效率。
官方题解给出暴力解法。