K-th Smallest in Lexicographical Order

題目來源
給兩個數字n和k,求按字母序排列的第k個數字。

Given integers n and k, find the lexicographically k-th smallest integer in the range from 1 to n.

然后我又棄療了,看了答案,就是這么一個過程,先算一下cur和cur+1之間的距離,距離要是大于k的話,那么把cur10就可以,因為cur10肯定是下一個。
如果小于k的話,那么直接把cur+1,然后計算下cur和cur+1之間距離是多少。
計算cur和cur+1之間的距離的話,就是不斷的把n1和n2乘10,然后判斷當前層有多少個數字,假如是滿的,那么就是n2-n1,如果不是滿的,那么就是n+1-n1。
具體可以看看討論區的解釋。

class Solution {
public:
    int findKthNumber(int n, int k) {
        int cur = 1;
        k--;
        while (k > 0) {
            int steps = calSteps(n, cur, cur + 1);
            if (k >= steps) {
                k -= steps;
                cur = cur + 1;
            }
            else {
                cur *= 10;
                k--;
            }
        }
        return cur;
    }
    
    int calSteps(int n, long long n1, long long n2)
    {
        int steps = 0;
        while (n1 <= n) {
            steps += static_cast<int>(min(n+1LL, n2) - n1);
            n1 *= 10;
            n2 *= 10;
        }
        return steps;
    }
};
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容