GuilinDev

Lc0386

05 August 2008

386 Lexicographical Numbers

给一个整数,按照字典序排序

例子

1
2
输入:n = 13
输出:[1,10,11,12,13,2,3,4,5,6,7,8,9]

DFS先序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution {

    public List<Integer> lexicalOrder(int n) {
        List<Integer> res=new ArrayList<>();
        // 没有0
        for(int i=1;i<10;i++){
            dfs(n,res,i);
        }
        return res;
    }
    void dfs(int n,List<Integer> res,int val){
        if(val>n)return ;
        res.add(val);
        for(int j=0;j<=9;j++){
            dfs(n,res,val*10+j);
        }
    }
}

从1开始, 一位一位的加到个位数的方式扩大数字, 这种方式先出现的满足n的数字 , 优先添加到ans中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Solution {
	public List<Integer> lexicalOrder(int n) {
		List<Integer> ans = new ArrayList<>();
		this.f(0, 1, n, ans);
		return ans;
	}

	/**
	 * 以base为基数, 从start开始添加到个位数, <=n的结果添加到ans中
	 * 
	 * @param base
	 * @param start
	 * @param n
	 * @param ans
	 */
	private void f(int base, int start, int n, List<Integer> ans) {
        if (base > n)
			return;
		for (int i = start; i < 10; i++) {
			int num = i + base;
			if (num <= n) {
				ans.add(num);
				this.f(num * 10, 0, n, ans);
			}
		}
	}
}