给定一个正整数,按字典序返回 [1,n] 内的正整数。
数据范围:
//数字首位是1或者2、3、4...,分成9个大的层次,字典序排列就是分别从每一层次向后排列到底(此处范围判定只有是否超过n这个条件),然后再排列下一层次的数据,属于深度优先搜索 ArrayList<Integer> list = new ArrayList<>(); public ArrayList<Integer> orderArray (int n) { //判断n小于10时,就是简单的顺序排列,这步其实可以不要 if(n<10){ for(int i=1;i<=n;i++){ list.add(i); } }else{ for(int i=1;i<10;i++){ dfs(i,n); } } return list; } public void dfs(int num,int n){ //边界判定,每个层次的数据是否超过n,超过就返回不排列 if(num > n){ return; } list.add(num); for(int i=0;i<10;i++){ dfs(num*10+i,n); } }
import java.util.*; public class Solution { //如果num*10后比n小,那么num*10就是下一个要放入list中的数 //如果num*10后比n大,那么就num++,其结果就是下一个要放入list中的数 //如果num的个位数为9或者num+1>n,说明需要进行进位操作,num=num/10,num++ //比如n为28 //num=19的话,就需要进位,即num/10后的结果加一,下一位数2 //num=28的话,也需要进位,即num/10后的结果加一,下一位数3 //一共需要向list中添加n次数字 public ArrayList<Integer> orderArray (int n) { ArrayList<Integer> list = new ArrayList<>(); int num = 1; for(int i = 0;i < n;i ++) { list.add(num); if(num * 10 <= n) { num *= 10; }else { while((num % 10 == 9) || (num + 1 > n)) { num /= 10; } num ++; } } return list; } }