通过万岁!!!
- 题目:给你一个n,然后将1-n之间的数,按照字典序进行排序。要求时间复杂度o(n),空间复杂度o(1)。
- 取巧思路:直接存到一个string数组中,然后Arrays.sort。然后转成list。好像排序是存在问题的,因为时间复杂度会超时,但是我居然过了,莫名其妙。虽然我们是通过万岁,但是也不能这么糊弄人啊。
- 正规思路:我的想法是一个递归,每次往list中添加一个元素num,如果num<n,则可以添加,然后让其*10继续递归,这样将扩大10倍的我们写完了。并且每个数后面应该就是这个数扩大10倍。扩大10倍结束以后,就应该写这个数+1了,我们循环到余数等于9即可,每次也是需要添加完以后递归,例如加完了12以后应该加120。
- 技巧:就是深度优先吧,其实就是找规律,然后按照规律填充这个数组即可。
java代码——取巧思路
class Solution {
public List<Integer> lexicalOrder(int n) {
String[] ans = new String[n];
for (int i = 1; i <= n; i++) {
ans[i - 1] = i + "";
}
Arrays.sort(ans);
int[] ints = Arrays.stream(ans).mapToInt(s -> Integer.parseInt(s)).toArray();
ArrayList<Integer> integers = new ArrayList<>(n);
for (int t : ints) {
integers.add(t);
}
return integers;
}
}
java代码——正规思路
class Solution {
public List<Integer> lexicalOrder(int n) {
ArrayList<Integer> integers = new ArrayList<>(n);
getList(integers, n, 1);
return integers;
}
private void getList(ArrayList<Integer> integers, int n, int num) {
if (num <= n) {
integers.add(num);
getList(integers, n, num * 10);
}
while (num % 10 != 9 && num < n) {
integers.add(++num);
getList(integers, n, num * 10);
}
}
}
- 总结:题目不是很难,并且比较有意思,居然取巧也能过。这里虽然递归嵌套while,但是while的时间复杂度是很小的,并且我们这个其实就是对数组进行变了一个一直add,时间复杂度就是o(n),空间复杂度的话,我们用了一个必须要的list变量,还有递归的栈。这个题没有双百,空间确实有的优点多。