如果一个整数上的每一位数字与其相邻位上的数字的绝对差都是 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());
         
         }
         
     }
 }