步进数
难度:
标签:
题目描述
代码结果
运行时间: 66 ms, 内存: 16.5 MB
/*
* 题目思路:
* 1. 使用Java Stream进行处理。
* 2. Stream的范围是[low, high]。
* 3. 过滤出所有的步进数。
* 4. 收集结果并返回。
*/
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class SteppingNumbersStream {
public static List<Integer> countSteppingNumbers(int low, int high) {
return IntStream.rangeClosed(low, high)
.filter(SteppingNumbersStream::isSteppingNumber)
.boxed()
.collect(Collectors.toList());
}
private static boolean isSteppingNumber(int num) {
if (num < 10) return true;
int prevDigit = num % 10;
num /= 10;
while (num > 0) {
int currentDigit = num % 10;
if (Math.abs(currentDigit - prevDigit) != 1) return false;
prevDigit = currentDigit;
num /= 10;
}
return true;
}
}
解释
方法:
这个题解使用了生成器方法来产生步进数。步进数是那些相邻数字位只差1的数。首先,它初始化一个由单个数字构成的步进数列表,并逐步构建更长的步进数。方法是对每个数字位,考虑它的前一个和后一个数字,通过连接操作形成新的步进数,并检查这些生成的数字是否位于给定的范围[low, high]内。
时间复杂度:
O(D * 10^D),其中D是high的位数
空间复杂度:
O(10^D),其中D是high的位数
代码细节讲解
🦆
生成器方法是如何确保只生成符合步进数定义的数,而不是任意数字?
▷🦆
如何处理当生成的步进数超过high的情况?是立即停止整个生成过程,还是逐个检查每个数是否符合条件后再决定是否继续生成?
▷🦆
在算法中,`byStarts` 和 `byStarts1` 两个列表是如何交替使用的,这种设计有什么特定的好处吗?
▷🦆
算法中递增base的作用是什么,它如何影响到生成步进数的过程?
▷