386.字典序排序
解题分析
对区间1-n范围内的数字进行字典序排序,直观想到,字符串排序通常是按照字典序排序,例如下面各种语言的排序方式:
words = ["banana", "Apple", "apple", "Banana"]
words.sort()
String words = {"banana", "Apple", "apple", "Banana"};
Arrays.sort(words);
System.out.println(Arrays.toString(words));
let words = ["banana", "Apple", "apple", "Banana"];
wors.sort();
因此可以将1-n区间内的数字转换为字符串数组,然后排序,经过转换为数字数组返回结果,如下所示:
class Solution {public List<Integer> lexicalOrder(int n) {// 创建1-n的字符串数组List<String> arr_string = new ArrayList<>();// 将字符串添加到列表中for (int i = 1; i <= n; i++){arr_string.add(String.valueOf(i));}// 使用Arrays.sort()// 对字符串进行字典序排序Collections.sort(arr_string);// 将排序后的数组转换为数字数组返回List<Integer> result = new ArrayList<>();for (String s : arr_string){result.add(Integer.parseInt(s));}return result;}
}
这种方式o(nlogn),直接排序会使用额外o(n)空间存储字符串数组。为了达到o(1)空间,不能使用直接排序。
字典序即按照字典的顺序排序,在计算机中两个字符串的大小关系取决于两个字符串从左到右第一个不同字符的ASCII值的大小。
字典序实际上是数字的前序遍历。
整数num,例如n=13,下一个对应的字典序整数应满足下面的规则:
- num * 10 <= n,则是下一个字典序,1x10=10 <13,所以是[1,10]
- 反之说明已经排到了[1,10,11,12,13],则从1位开头的字典序已经排完了,应该是从num%10==9开始下一个,因此获取到下一个位数开头的或者说是num+1 > n,注意num/10之后+1
如下所示:
class Solution {public List<Integer> lexicalOrder(int n) {// 实际上是判断数字字典序,// 判断数字字典序有规则的// 新建返回结果的数组List<Integer> result = new ArrayList<>();int nums = 1;// 遍历for (int i = 1; i <= n; i++){result.add(nums);// 找到下一个if (nums * 10 <= n){nums *= 10;}else {while (nums%10 == 9 || nums + 1 > n){// 这一位的满足数找完了nums /= 10;}nums ++;}}return result;}
}
参考
字典序及1-n之间的数按字典序排列
java数组
声明数组:
int[] result = new int[n]; result[0] = 1;
int[] result = {1,2,3};
- ArrayList是一个动态修改的数组,
ArrayList<Integer> new ArrayList<>();
- 使用
add()
方法添加元素 - 使用
get()
方法访问元素 - 使用
set(int index, E element)
- 使用
remove()
方法删除元素 - 使用
size()
得到数量 - 使用
Collections.sort()
进行排序
- 使用
遍历数组:
- 循环遍历数组
for (int i = 0; i < result.length; i++)
- For-Each循环
for (int elem : result)