LeetCode #386 Lexicographical Numbers 字典序排數(shù)

386 Lexicographical Numbers 字典序排數(shù)

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.

題目描述:
給定一個整數(shù) n, 返回從 1 到 n 的字典順序。

示例 :

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

請盡可能的優(yōu)化算法的時間復雜度和空間復雜度。 輸入的數(shù)據(jù) n 小于等于 5,000,000。

思路:

  1. 先排序字符串, 然后將排序好的字符串轉換為整數(shù)
    時間復雜度O(nlgn), 空間復雜度O(n)
  2. 設置一個指針
    比如需要放 1-130
    指針開始指向 1, 下一個應該放 10, 所以比較指針 * 10和 n的大小關系
    指針自乘 10直到超過 n
    這時已經(jīng)放入了 [1, 10, 100],
    由于 100 * 10 > 130, 此時下一個應該是 11, 這時指針需要從 100移動到 11, 比較指針和 n的大小, 指針超過 n就自除 10, 然后自增直到 20, 下一個數(shù)為2, 所以當?shù)臀皇?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èi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容