728.自除数
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/self-dividing-numbers
自除数 是指可以被它包含的每一位数除尽的数。
例如,128 是一个自除数,因为 128 % 1 == 0,128 % 2 == 0,128 % 8 == 0。
还有,自除数不允许包含 0 。
给定上边界和下边界数字,输出一个列表,列表的元素是边界(含边界)内所有的自除数。
示例 1:
输入:
上边界left = 1, 下边界right = 22
输出: [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 15, 22]
注意:
每个输入参数的边界满足 1 <= left <= right <= 10000。
思路分析:直接循环取数的各位,去除原数即可
class Solution {
public List<Integer> selfDividingNumbers(int left, int right) {
List<Integer> list = new ArrayList<>();
for(int i=left;i<=right;i++){
int x=i,a;
int flag=1;
while(x>0){
a=x%10; //取当前位数字
if(a==0||i%a!=0){ //判断是否有0和是否整除(判断0要放在前面)
flag=0;
}
x/=10;
}
if(flag==1){
list.add(i);
}
}
return list;
}
}
刚开始忘记了判断数字中是否有0,
与官方思路相同。
官方代码:
算法:
对于给定范围内的每个数,我们将直接判断该数是否为自除数。
根据定义,我们先判断数字是否非零,若数字非零再判断是否能够被该数除尽。例如,对于 128,我们要判断 d != 0 && 128 % d == 0,且 d = 1, 2, 8。
解决这个问题的一个简单方法是将数字转换成一个字符数组(python 中的字符串),然后在检查 n%d==0 时转换回整数执行模运算。
我们还可以不断地把数字除以 10,取整数的最后一个数字。在代码中为注释的部分。
class Solution {
public List<Integer> selfDividingNumbers(int left, int right) {
List<Integer> ans = new ArrayList();
for (int n = left; n <= right; ++n) {
if (selfDividing(n)) ans.add(n);
}
return ans;
}
public boolean selfDividing(int n) {
for (char c: String.valueOf(n).toCharArray()) {
if (c == '0' || (n % (c - '0') > 0))
return false;
}
return true;
}
/*
Alternate implementation of selfDividing:
public boolean selfDividing(int n) {
int x = n;
while (x > 0) {
int d = x % 10;
x /= 10;
if (d == 0 || (n % d) > 0) return false;
}
return true;
*/
}
给出了两张方法。感觉用字符来做很方便