두 개의 값 n과 k가 있다고 가정합니다. 1에서 n 사이의 범위에서 사전식으로 k번째로 작은 정수를 찾아야 합니다. 따라서 입력이 n =14 및 k =3인 경우 시퀀스는 [1, 10, 11, 12, 13, 14, 2, 3, 4, 5, 6, 7이므로 출력은 11이 됩니다. , 8, 9], k번째 숫자는 11입니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
- findKthNumber() 함수를 정의합니다. n, k,
- 커:=1
- (k를 1씩 감소)
- k가 0이 아닌 동안 −
- steps :=calcSteps(n, curr, curr + 1) 함수 호출
- 단계가 <=k이면 -
- k :=k - 단계
- (통화를 1씩 증가)
- 그렇지 않으면
- curr :=curr * 10
- k :=k - 1
- 반환 통화
- calcSteps() 함수를 정의하면 nax, n1, n2,
- ret :=0
- n1 <=nax인 동안 −
- ret :=ret + nax + 1 및 n2 – n1의 최소값
- n1 :=n1 * 10
- n2 :=n2 * 10
- 반환
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
예시
#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));
} 입력
14,3
출력
11