386 字典序排数

LeetCode题目链接链接

[https://leetcode-cn.com/problems/lexicographical-numbers/]

题目

给定一个整数 n, 返回从 1 到 n 的字典顺序。

例如,

给定 n =1 3,返回 [1,10,11,12,13,2,3,4,5,6,7,8,9] 。

请尽可能的优化算法的时间复杂度和空间复杂度。 输入的数据 n 小于等于 5,000,000。

分析

首先。比较简单粗暴的方法,因为是字典顺序,把所有数字都转化为为字符串,然后字符串排序,排序后重新转化为Integer
代码如下

class Solution {
    public List<Integer> lexicalOrder(int n) {
        List<String> list = new ArrayList<>();
        for (int i = 1;i <= n;i++) {
            StringBuilder builder = new StringBuilder();
            builder.append(i);
            list.add(builder.toString());
        }
        
        Collections.sort(list);
        
        List<Integer> ans = new ArrayList<>();
        for (String s : list) {
            ans.add(Integer.parseInt(s));
        }
        
        return ans;
    }
}

效果如下

image.png

第二种解法

输入
10
输出
[1,10,2,3,4,5,6,7,8,9]

输入
101
输出
[1,10,100,101,11,12,13,14,15,16,17,18,19,2,20,21,22,23,24,25,26,27,28,29,3,30,31,32,33,34,35,36,37,38,39,4,40,41,42,43,44,45,46,47,48,49,5,50,51,52,53,54,55,56,57,58,59,6,60,61,62,63,64,65,66,67,68,69,7,70,71,72,73,74,75,76,77,78,79,8,80,81,82,83,84,85,86,87,88,89,9,90,91,92,93,94,95,96,97,98,99]
根据代码找规律吧

class Solution {
   public List<Integer> lexicalOrder(int n) {
        int cur=1;
            List<Integer> sort = new ArrayList<>(n);
            for(int i=0;i<n;i++)
            {
               sort.add(cur);
                if(cur*10<=n){
                    cur*=10;
                  }
                else
                {
                    if(cur>=n)
                        cur/=10;
                    cur+=1;
                    while(cur%10==0)
                        cur/=10;
                }
            }

            return sort ;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。