[LeetCode 440] 字典序的第K小数字


给定整数 n 和 k,找到 1 到 n 中字典序第 k 小的数字。

注意:1 ≤ k ≤ n ≤ 109。


\(f(n,m)=card\{ x|1\le x \le n \space \wedge \space x[0:|m|]=m \}\)

class Solution {
public:
    int findKthNumber(int n, int k) {
        const int c1[10]={1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000};
        const int c2[10]={0,1,11,111,1111,11111,111111,1111111,11111111,111111111};
        auto f=[&](int n,int m)->int 
        {
            int d=to_string(n).length()-to_string(m).length();
            if(n/c1[d]==m) return n%c1[d]+1+c2[d];
            else if(n/c1[d]>m) return c1[d]+c2[d];
            else return c2[d];
        };
        int x=1;
        while(k!=1)
        {
            int t=f(n,x);
            if(t

相关