Giả sử chúng ta có hai giá trị n và k. Chúng ta phải tìm số nguyên nhỏ nhất từ điển thứ k trong phạm vi từ 1 đến n. Vì vậy, nếu đầu vào là n =14 và k =3, thì đầu ra sẽ là 11, vì dãy sẽ là [1, 10, 11, 12, 13, 14, 2, 3, 4, 5, 6, 7 , 8, 9], thì số thứ k là 11.
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
- Xác định một hàm findKthNumber (), hàm này sẽ nhận n, k,
- curr:=1
- (giảm k đi 1)
- while k khác 0, do -
- step:=gọi hàm calcSteps (n, curr, curr + 1)
- nếu các bước <=k, thì -
- k:=k - các bước
- (tăng độ cong lên 1)
- Mặt khác
- curr:=curr * 10
- k:=k - 1
- return curr
- Xác định một hàm calcSteps (), hàm này sẽ lấy nax, n1, n2,
- ret:=0
- while n1 <=nax, do -
- ret:=ret + tối thiểu nax + 1 và n2 - n1
- n1:=n1 * 10
- n2:=n2 * 10
- trả lời lại
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
Ví dụ
#include <bits/stdc++.h>
using namespace std;
typedef long long int lli;
class Solution {
public:
int findKthNumber(int n, int k) {
int curr = 1;
k--;
while(k){
int steps = calcSteps(n, curr, curr + 1);
if(steps <= k){
k -= steps;
curr++;
}else{
curr *= 10;
k -= 1;
}
}
return curr;
}
int calcSteps(lli nax, lli n1, lli n2){
int ret = 0;
while(n1 <= nax){
ret += min(nax + 1, n2) - n1;
n1 *= 10;
n2 *= 10;
}
return ret;
}
};
main(){
Solution ob;
cout << (ob.findKthNumber(14,3));
} Đầu vào
14,3
Đầu ra
11