如果一个整数上的每一位数字与其相邻位上的数字的绝对差都是 1,那么这个数就是一个「步进数」。
例如,321 是一个步进数,而 421 不是。
给你两个整数,low 和 high,请你找出在 [low, high] 范围内的所有步进数,并返回 排序后 的结果。
示例:
输入:low = 0, high = 21
输出:[0,1,2,3,4,5,6,7,8,9,10,12,21]
提示:
0 <= low <= high <= 2 * 10^9
思路:一开始暴力解法,但是取值范围2*10^9,呃,明显不可能通过
先把所有步进数求出来放到一个集合,排下序。然后再遍历取其中在low与high范围内的数添加到结果集合
求步进数是用 DFS 的方法,以 1 到 9 开头,每次把当前数乘 10 加上个位数加 1 或减 1。注意一下个位为 0 和 9 的特殊情况。
0 特殊处理。
提交的代码:
class Solution {
public static List<Integer> countSteppingNumbers(int low, int high) {
int i;
List<Integer> list = new ArrayList();
List<Integer> list1 = new ArrayList();
list.add(0);
for(i=1;i<=9;i++)
{
DFS(list,i);
}
Collections.sort(list);
for(int in:list)
{
if(in>=low&&in<=high)
{
list1.add(in);
}
}
return list1;
}
public static void DFS(List<Integer> list,int i)
{
list.add(i);
if(i>Integer.MAX_VALUE / 10)
{
return;
}
if(i%10!=0)
{
DFS(list,(i%10-1+i*10));
}
if(i%10!=9)
{
DFS(list,(i%10+1+i*10));
}
}
}
完整代码:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
public class Solution5081 {
public static List<Integer> countSteppingNumbers(int low, int high) {
int i;
List<Integer> list = new ArrayList();
List<Integer> list1 = new ArrayList();
list.add(0);
for(i=1;i<=9;i++)
{
DFS(list,i);
}
Collections.sort(list);
for(int in:list)
{
if(in>=low&&in<=high)
{
list1.add(in);
}
}
return list1;
}
public static void DFS(List<Integer> list,int i)
{
list.add(i);
if(i>Integer.MAX_VALUE / 10)
{
return;
}
if(i%10!=0)
{
DFS(list,(i%10-1+i*10));
}
if(i%10!=9)
{
DFS(list,(i%10+1+i*10));
}
}
public static void main(String[] args)
{
int low,high;
low = 10;
high =15;
List list = countSteppingNumbers(low,high);
Iterator it = list.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}
}
}
可以在DFS中中加入low,high判断条件,这样无需找出所有的步进数。
提交的代码:
class Solution {
public static List<Integer> countSteppingNumbers(int low, int high) {
int i;
List<Integer> list = new ArrayList();
if(low==0)
{
list.add(0);
}
for(i=1;i<=9;i++)
{
DFS(list,i,low,high);
}
Collections.sort(list);
return list;
}
public static void DFS(List<Integer> list,int i,int low,int high)
{
if(i>=low&&i<=high)
{
list.add(i);
}
if(i>Integer.MAX_VALUE / 10)
{
return;
}
if(i%10!=0&&(i%10-1+i*10)>=0&&(i%10-1+i*10)<=high)
{
DFS(list,(i%10-1+i*10),low,high);
}
if(i%10!=9&&(i%10+1+i*10)>=0&&(i%10+1+i*10)<=high)
{
DFS(list,(i%10+1+i*10),low,high);
}
}
}
完整代码:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
public class Solution5081 {
public static List<Integer> countSteppingNumbers(int low, int high) {
int i;
List<Integer> list = new ArrayList();
if(low==0)
{
list.add(0);
}
for(i=1;i<=9;i++)
{
DFS(list,i,low,high);
}
Collections.sort(list);
return list;
}
public static void DFS(List<Integer> list,int i,int low,int high)
{
if(i>=low&&i<=high)
{
list.add(i);
}
if(i>Integer.MAX_VALUE / 10)
{
return;
}
if(i%10!=0&&(i%10-1+i*10)>=0&&(i%10-1+i*10)<=high)
{
DFS(list,(i%10-1+i*10),low,high);
}
if(i%10!=9&&(i%10+1+i*10)>=0&&(i%10+1+i*10)<=high)
{
DFS(list,(i%10+1+i*10),low,high);
}
}
public static void main(String[] args)
{
int low,high;
low = 0;
high =21;
List list = countSteppingNumbers(low,high);
Iterator it = list.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}
}
}