主要是关于LeetCode当中的字典序排序问题
Given an integer n, return 1 - n in lexicographical order.
For example, given 13, return: [1,10,11,12,13,2,3,4,5,6,7,8,9].
给 30
1,10,11,12,13,14,15,16,17,18,19, 2,20,
解决步骤
// 49999 49 这两种方式都要处理成为 5 , 只是对应的n 取值不是一样的基本情况
Given an integer n, return 1 - n in lexicographical order.
For example, given 13, return: [1,10,11,12,13,2,3,4,5,6,7,8,9].
public class Solution{
public List<Integer> sloved(int n){
List<Integer> result =new LinkedList<>();
if(n==0) return result;
int current =1;
// 0````00 一共有n 位可以取值的基本情况
for(int i=1;i<=n;i++){
result.add(current);
// 如果可以一直*到10000000000, 1位
if(current*10<=n){
// 在后面加一个10,, 比如1 ,n=10, 我们就可以10
// 1, 10
current *=10;
}
//以数字9结尾的数字不能进行++操作,等基本概念
// ++1 的边界条件
else if (current+1<=n && current%10!=9) {
current++;
}
// 进行回退操作 比如 n=550, 现在是499 ,不能加1操作, 加1就是500 漏了5这些
// 所以需要进行一个回退操作
// 将499这样的数据进行回退, 449 转变成为5 499, 49
// 897 89
else{
// 处理连续的9999 比如 499999 最终进过while 循环变成49的基本情况
while((current/10)%10==9)
{
current /=10;
}
// while 循环只能把499 变换我49 ,最后我们还是需要最后一步进行处理
//将49转换为5
//
current = current/10 +1;
}
}
return result;
}
}
}
class Solution {
public List<Integer> lexicalOrder(int n) {
List<Integer> result =new LinkedList<>();
if(n==0) return result;
// 所有的数字
// 分别从1,2,3,4,5,6,7,8 9,这些数字开回溯
//For example, given 13, return: [1,10,11,12,13,2,3,4,5,6,7,8,9].
for(int i=1;i<10;i++){
dfs(n,i,result);
}
return result;
}
private void dfs(int n, int current, List<Integer> result){
// 剪纸的基础条件情况
if(current>n)
return;
result.add(current);
current *=10;
for(int i=0;i<10;i++){
// 进一步进行深度有效搜索
if(current+i>n)
return;
dfs(n,current+i,result);
}
}
}