題目連結:
題目意譯:
給定一個整數 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。
(四):(三)的又一個但書。如果到步驟(三)時,去掉個位數時會什麼都不剩的時候。則此時窮舉的過程停止。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。