题目内容描述
解题思路
根据题目内容描述,自除数,首先不允许包含0,其次对自身的每一位求余都为0。 我的思路是首先将数字转成字符串,然后遍历字符串中的每一位字符,转成数字,判断是否为0,不为0的话则进行求余操作,判断结果是否为0,所有字符循环完成后均为0,那么这个数就为自除数。
解题结果
class Solution {
public List<Integer> selfDividingNumbers(int left, int right) {
List<Integer> result = new ArrayList();
for(int begin = left;begin<=right;begin++){
String beginStr = String.valueOf(begin);
boolean zichu = true;
for(int i=0;i<beginStr.length();i++){
int temp = Integer.parseInt(String.valueOf(beginStr.charAt(i)));
if(temp == 0 || begin % temp != 0){
zichu = false;
break;
}
}
if(zichu){
result.add(begin);
}
}
return result;
}
}
执行性能
执行用时:8 ms, 在所有 Java 提交中击败了6.01%的用户
内存消耗:41.6 MB, 在所有 Java 提交中击败了5.05%的用户
通过测试用例:31 / 31
整体上来说,解题方式没问题,结果是对的,但是方式并不是最优的。
官方解法
遍历整数的每一位的方法是,每次将当前整数对 10取模即可得到当前整数的最后一位,然后将整数除以 10。重复该操作,直到当前整数变成 0时即遍历了整数的每一位。跟官方解法相比,我的方法多了一部分从int转string再转int的过程,所以用时和内存消耗都会多。
执行性能:
执行用时:1 ms, 在所有 Java 提交中击败了98.77%的用户
内存消耗:38.8 MB, 在所有 Java 提交中击败了95.36%的用户
通过测试用例:31 / 31
class Solution {
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;
}
}