题目描述:
自除数 是指可以被它包含的每一位数整除的数。
例如,128 是一个 自除数 ,因为 128 % 1 == 0,128 % 2 == 0,128 % 8 == 0。
自除数 不允许包含 0 。
给定两个整数 left 和 right ,返回一个列表,列表的元素是范围 [left, right] 内所有的 自除数 。
示例 1:
输入:left = 1, right = 22
输出:[1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 15, 22]
示例 2:
输入:left = 47, right = 85
输出:[48,55,66,77]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/self-dividing-numbers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
-------------------------------------------------------------------------------------------------------------------------------
day12:今天是个简单题,看题目很容易就想到通过string取单个char或者通过/10和%10的操作来做,转char肯定是更麻烦也更耗时间内存的,所以我们用了除以取余的方式来做,代码如下:
public List<Integer> selfDividingNumbers(int left, int right) {
List<Integer> list = new ArrayList<>();
int num = 0;
boolean flag;
while(left <= right){
num = left;
do{
if(num % 10 == 0 || (left % (num % 10) != 0)){
flag = false;
break;
}
else
flag = true;
}while((num /= 10) > 0);
if(flag)
list.add(left);
left ++ ;
}
return list;
}
思路解析:定义一个列表用来返回结果,nun表示每次的数,flag用来判断是否为自然数,然后避免用for循环来接收left到right的值,就用了个while来直接判断(建议还是使用for,会更快一点),这里用do-while的方式除以取余,因为要算每一位的,所以先执行再循环,当取到了0或者不能被left整除就直接返回false,只有每一位都能被整除且不为0才返回true(这里建议把do-while封装成一个函数,会更快更节省内存),最后根据判断是否为自然数来把当前数加到列表中。
看看封装的:
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;
}