LeetCode #386 Lexicographical Numbers 字典序排数

386 Lexicographical Numbers 字典序排数

Description:
Given an integer n, return 1 - n in lexicographical order.

Example:

For example, given 13, return: [1,10,11,12,13,2,3,4,5,6,7,8,9].

Please optimize your algorithm to use less time and space. The input size may be as large as 5,000,000.

题目描述:
给定一个整数 n, 返回从 1 到 n 的字典顺序。

示例 :

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

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

思路:

  1. 先排序字符串, 然后将排序好的字符串转换为整数
    时间复杂度O(nlgn), 空间复杂度O(n)
  2. 设置一个指针
    比如需要放 1-130
    指针开始指向 1, 下一个应该放 10, 所以比较指针 * 10和 n的大小关系
    指针自乘 10直到超过 n
    这时已经放入了 [1, 10, 100],
    由于 100 * 10 > 130, 此时下一个应该是 11, 这时指针需要从 100移动到 11, 比较指针和 n的大小, 指针超过 n就自除 10, 然后自增直到 20, 下一个数为2, 所以当低位是 0的时候, 需要去掉
    时间复杂度O(nlgn), 空间复杂度O(1)

代码:
C++:

class Solution 
{
public:
    vector<int> lexicalOrder(int n) 
    {
        vector<int> result(n);
        int cur = 1;
        for (int i = 0; i < n; i++)
        {
            result[i] = cur;
            if (cur * 10 <= n) cur *= 10;
            else
            {
                if (cur >= n) cur /= 10;
                ++cur;
                while (!(cur % 10)) cur /= 10;
            }
        }
        return result;
    }
};

Java:

class Solution {
    public List<Integer> lexicalOrder(int n) {
        String list[] = new String[n];
        for (int i = 1; i < n + 1; i++) list[i - 1] = String.valueOf(i);
        Arrays.sort(list);
        List<Integer> result = new ArrayList<>(n);
        for (String s : list) result.add(Integer.valueOf(s));
        return result;
    }
}

Python:

class Solution:
    def lexicalOrder(self, n: int) -> List[int]:
        return sorted(range(1, n + 1), key=str)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 题目:给定一个整数 n, 返回从 1 到 n 的字典顺序。例如,给定 n =13,返回 [1,10,11,12,1...
    关山Kwan阅读 910评论 0 0
  • 题目链接难度:中等 类型: 数组、排序 给定一个整数 n, 返回从 1 到 n 的字典顺序。 例...
    wzNote阅读 3,685评论 0 1
  • LeetCode题目链接链接 [https://leetcode-cn.com/problems/lexicogr...
    Mastergad阅读 2,738评论 0 0
  • 题目 难度:★★★☆☆类型:数组方法:深度优先搜索 传送门 给定一个整数 n, 返回从 1 到 n 的字典顺序。 ...
    玖月晴阅读 4,007评论 0 1
  • 久违的晴天,家长会。 家长大会开好到教室时,离放学已经没多少时间了。班主任说已经安排了三个家长分享经验。 放学铃声...
    飘雪儿5阅读 12,195评论 16 22