Self Dividing Numbers
Description:
A self-dividing number is a number that is divisible by every digit it contains.
For example, 128 is a self-dividing number because 128 % 1 == 0
, 128 % 2 == 0
, and 128 % 8 == 0
.
Also, a self-dividing number is not allowed to contain the digit zero.
Given a lower and upper number bound, output a list of every possible self dividing number, including the bounds if possible.
Example 1:
Input:
left = 1, right = 22
Output: [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 15, 22]
Note:
The boundaries of each input argument are 1 <= left <= right <= 10000
.
问题描述:
Solution:
解法一:笨办法= =:
class Solution {
public List<Integer> selfDividingNumbers(int left, int right) {
List<Integer> list = new ArrayList<>();
for(int i = left; i <= right; i++){
if(i < 10 && i >= 1){
list.add(i);
continue;
}
String val = String.valueOf(i);
if(!val.contains("0")){
char[] chars = val.toCharArray();
for(int j = 0; j < val.length(); j++){
int v = chars[j] - '0';
if(i % v != 0){
break;
}
if(j == val.length() - 1 && i % v == 0){
list.add(i);
}
}
}
}
return list;
}
}
没错!就是根据题目要求一步一步做下来,多次进行类型转换,非常耗时。需要来个简单点的,实现优雅点的方式。
解法二:
class Solution {
public List<Integer> selfDividingNumbers(int left, int right) {
List<Integer> list = new ArrayList<>();
for(int i = left; i <= right; i++){
int j = i;
for( ; j > 0; j = j / 10){
if(j % 10 == 0 || i % ( j % 10) != 0) break;
}
if(j == 0) list.add(i);
}
return list;
}
}
解题步骤 128可以表示成 128 = 1*100 + 2*10 + 8*1,也就是说想获取到个位的数字只需要将128除以10取余数8即可。然后用128除以8看是否能被整除,如果能被整除,接下来要做的是获取十位上的数字。将128 -> 12 ,128/10 = 12,然后重复之前的步骤。
伪代码:
E.g. if i = 128 number:
128 % 10 = 8, check 8 != 0;
remove 8 from next step j = 128 / 10 = 12
repeat 1 and 2 until j == 0