列表

详情


386. 字典序排数

给你一个整数 n ,按字典序返回范围 [1, n] 内所有整数。

你必须设计一个时间复杂度为 O(n) 且使用 O(1) 额外空间的算法。

 

示例 1:

输入:n = 13
输出:[1,10,11,12,13,2,3,4,5,6,7,8,9]

示例 2:

输入:n = 2
输出:[1,2]

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: vector<int> lexicalOrder(int n) { } };

java 解法, 执行用时: 4 ms, 内存消耗: 46 MB, 提交时间: 2022-11-16 12:42:40

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

java 解法, 执行用时: 4 ms, 内存消耗: 46.1 MB, 提交时间: 2022-11-16 12:41:59

class Solution {
    List<Integer> ans = new ArrayList<>();
    public List<Integer> lexicalOrder(int n) {
        for (int i = 1; i <= 9; i++) dfs(i, n);
        return ans;
    }
    void dfs(int cur, int limit) {
        if (cur > limit) return ;
        ans.add(cur);
        for (int i = 0; i <= 9; i++) dfs(cur * 10 + i, limit);
    }
}

golang 解法, 执行用时: 4 ms, 内存消耗: 6.3 MB, 提交时间: 2022-11-16 12:40:40

func lexicalOrder(n int) []int {
    ans := make([]int, n)
    num := 1
    for i := range ans {
        ans[i] = num
        if num*10 <= n {
            num *= 10
        } else {
            for num%10 == 9 || num+1 > n {
                num /= 10
            }
            num++
        }
    }
    return ans
}

python3 解法, 执行用时: 44 ms, 内存消耗: 21.9 MB, 提交时间: 2022-11-16 12:36:34

class Solution:
    def lexicalOrder(self, n: int) -> List[int]:
        nums = [i for i in range(1, n+1)]
        return sorted(nums, key=lambda x: str(x))

上一题