ETH官方钱包

前往
大廳
主題

LeetCode - 0386. Lexicographical Numbers 解題心得

Not In My Back Yard | 2024-10-04 12:00:10 | 巴幣 2 | 人氣 40

題目連結:


題目意譯:
給定一個整數 n,回傳範圍 [1, n] 中以字典序排序後的所有數字。

你需要寫出一個 O(n) 時間複雜度且只用 O(1) 額外空間的演算法。

限制:
1 ≦ n ≦ 5 × 10 ^ 4



範例測資:
範例 1:
輸入: n = 13
輸出: [1,10,11,12,13,2,3,4,5,6,7,8,9]

範例 2:
輸入: n = 2
輸出: [1,2]


解題思維:
可以看到因為是要以字典序排序的緣故。

因此 1 開頭的數字(如 1 、 1111 、 15)會排在最前面,其後接著 2 開頭的數字(如 20 、 29)……以此類推。

而我們可以繼續這個過程——那些 1 開頭的數字去掉原先的開頭 1 之後,又可以繼續分成 0 開頭、 1 開頭等等。而值得注意的是數字 1 本身,去掉開頭之後會什麼都不剩。而這要排在 0 開頭前面。

並且其他開頭的數字也是同理。



因此我們的演算法會是如下:
(一):從數字 1 開始。
(二):重複地在結尾補 0 直到大過 n 為止。因此「最一開始」會得到 10 、 100 、 1000 等數字。
(三):回到補 0 後會大過 n 之前的數字並將現在的個位數 + 1。並回到步驟(二);但倘若現在個位數恰好為 9(又或是 + 1 之後大過 n),需要把現在這個個位數直接刪除並重複步驟(三)。因為如果是 119,我們需要先得到 12 而不是 120。
(四):(三)的又一個但書。如果到步驟(三)時,去掉個位數時會什麼都不剩的時候。則此時窮舉的過程停止。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

追蹤 創作集

作者相關創作

更多創作