題目來源
給兩個數字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;
}
};