[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