```java
class Solution {
public int findKthNumber(int k) {
int digit=1; //数字k所在数的位数
long start=1; //每digit位数的起始数字
long count=9; //各 digit 下的数位数量 count 的计算公式
while(k-count>0){
k-=count;
start*=10;
digit+=1;
count=count*start*digit;
} //确定所求数的digit,start
long num=start+(k-1)/digit; //确定第k个数对应的数字
int l=(k-1)%digit;
return Long.toString(num).charAt(l)-'0';
}
}
时间复杂度:O(logk)
空间复杂度:O(logk)
class Solution {
public int findKthNumber(int n) {
if (n == 0) {
return 0;
}
long bit = 1;
int i = 1;
long count = 9;
// 确定是几位数
while (count < n) {
n = (int) (n - count);
bit = bit * 10;
i++;
count = bit * i * 9;
}
// 确定是哪个数
long num = bit + (n - 1) / i;
// 确定是这数的第几位
int index = (n - 1) % i + 1;
int res = (int) (num / Math.pow(10, i - index)) % 10;
return res;
}
}
class Solution {
public:
int findKthNumber(int k) {
if(k < 10) {
return k;
}
long a = 9;
long b = 1;
while(k > a * b) {
k -= a * b;
a *= 10;
b += 1;
}
int m = (k - 1) % b;
int res = a / 9 + (k - 1) / b;
for (int i = m + 1; i < b; i++) {
res = res / 10;
}
return res % 10;
}
};
class Solution {
public int findKthNumber(int k) {
long start=1;
int digitLength=1;
long count=9;
while(k> count*digitLength){
k-=count*digitLength;
digitLength++;
count*=10;
start*=10;
}
long num=(k-1)/digitLength+start;
String numstr=Long.toString(num);
return Character.getNumericValue(numstr.charAt((k-1)%digitLength));
}
}
共以下 9 个回答
时间复杂度O(logn)
空间复杂度O(1)
“`
解题思路
– 根据位数去找数据的规律,分别是最小值,最大值,数字的数量,字符的数量
– 首先是确定位数。如何确定位数呢,使用累减法,k-1位时字符的数量-2位时字符的数量-….
– 再确定具体哪一个数字。就看剩余未减少的k能覆盖指定范围位数里面的多少个数
– 再确定数字的哪个字符。
【题解1】
思路:找到 k 所对应的数字是几位数,然后确定具体数字。
时间复杂度:O(logk)
空间复杂度:O(1)
感觉在做行测题哈哈,我之前好像刷到过这种计算题
根据规律,先找到对应哪个数字,记录在res中,在找到对应res中的哪一位,记录在m中,最后返回。
时间复杂度O(Logk),空间复杂度O(1)。
找到k对应的数级之后就好办了,通过对数位的/%操作获得所求位
Ologk Ologk
lass Solution {
public int findKthNumber(int k) {
int digit = 1; // 当前数字的位数
long start = 1; // 当前位数的起始数字
long count = 9; // 当前位数的数字总个数 * 位数
}