自除数
难度:
标签:
题目描述
代码结果
运行时间: 28 ms, 内存: 15.9 MB
/*
* 题目思路:
* 使用Java Stream API实现自除数的判断和筛选。
* Stream可以简化代码的编写,通过流操作来实现过滤和收集。
* 这里我们使用rangeClosed来生成[left, right]范围的数字流,
* 然后过滤掉不是自除数的数字,最后收集到列表中。
*/
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class SelfDividingNumbersStream {
public static List<Integer> selfDividingNumbers(int left, int right) {
return IntStream.rangeClosed(left, right)
.filter(SelfDividingNumbersStream::isSelfDividing)
.boxed()
.collect(Collectors.toList());
}
private static boolean isSelfDividing(int num) {
int originalNum = num;
while (num > 0) {
int digit = num % 10;
if (digit == 0 || originalNum % digit != 0) {
return false;
}
num /= 10;
}
return true;
}
public static void main(String[] args) {
System.out.println(selfDividingNumbers(1, 22));
}
}
解释
方法:
该题解的思路是遍历从 left 到 right 的所有整数,对于每个整数 i,判断它是否是自除数。判断的方法是不断对 i 进行整除 10 的操作,得到每一位数字,然后判断 i 是否能被每一位数字整除。如果出现任何一位数字为 0,或者 i 不能被某一位数字整除,则 i 不是自除数。如果 i 能被它的每一位数字整除,则将其加入到结果列表中。
时间复杂度:
O(n * logr)
空间复杂度:
O(n)
代码细节讲解
🦆
在解决这个问题时,如何处理多位数中包含0的情况,从而保证不会发生除以零的错误?
▷🦆
为什么在判断自除数时采用了从右到左检查每一位数的方法,而不是其他方式?
▷🦆
在题解的算法中,如果输入的范围left和right非常接近,但数值本身很大,比如9990到10000,这种情况下算法的效率如何?
▷🦆
如果要扩展这个问题,使其能处理更大范围的数(例如超过10^4),那么现有的算法是否还适用,或者需要哪些优化?
▷