給定整數 n 和 k,找到 1 到 n 中字典序第 k 小的數字。
注意:1 ≤ k ≤ n ≤ 109。
示例 :
輸入:
n: 13 k: 2
輸出:
10
解釋:
字典序的排列是 [1, 10, 11, 12, 13, 2, 3, 4, 5, 6, 7, 8, 9],所以第二小的數字是 10。
題解:
題目求字典序最小的第k個數,我們可以考慮字典樹,假設我們有一顆字典樹(10叉樹),那麼我們可以判斷相鄰兩個前綴之間相差的數量,如果大於K,那麼答案就是以小的前綴開頭的進入下一層繼續判斷。如果小於等於K那麼繼續往後判斷下一個前綴。最終找到答案。
參考代碼:
1 class Solution { 2 public: 3 int fun(long long n,long long cur,long long res) 4 { 5 long long steps=0; 6 while(cur<=n) 7 { 8 steps+=min(n+1,res)-cur; 9 cur*=10; res*=10; 10 } 11 return steps; 12 } 13 14 int findKthNumber(int n, int k) 15 { 16 int ans=1; --k; 17 while(k>0) 18 { 19 int steps=fun(n,ans,ans+1); 20 if(steps>k) --k,ans=ans*10; 21 else k-=steps,ans++; 22 } 23 return ans; 24 } 25 };