字典序排数
给你一个整数 n
,按字典序返回范围 [1, n]
内所有整数。
你必须设计一个时间复杂度为 O(n)
且使用 O(1)
额外空间的算法。
示例1
输入:n = 13 输出:[1,10,11,12,13,2,3,4,5,6,7,8,9]
示例2
输入:n = 2 输出:[1,2]
提示
1 <= n <= 5 * 104
方法一
思路
重写排序规则,改为按照字符串字典序排序,(此方法时间复杂度不符合要求)
public List<Integer> lexicalOrder(int n) {
List<Integer> list = new ArrayList<>();
for (int i = 0; i < n; i++) {
list.add(i + 1);
}
Collections.sort(list,new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1.toString().compareTo(o2.toString());
}
});
return list;
}
方法二
思路
深度优先搜索,由于本题要求是按照字典序排序,则10,100,1000等数字是要排在2前面的
那么对于从1开始的number,则有
- number * 10 <= n,则number为下一个加入结果集的数字
- number % 10 == 9 或 number + 1 > n则此数位枚举完毕,需返回上一数位,否则number + 1继续枚举本数位数字即可
public List<Integer> lexicalOrder(int n) {
List<Integer> res = new ArrayList<>();
int number = 1;
for(int i = 0;i < n;i++){
res.add(number);
if(number * 10 <= n){
number *= 10;
}else {
while(number % 10 == 9 || number + 1 > n){
number /= 10;
}
number++;
}
}
return res;
}