44.数字序列中某一位的数字
大约 2 分钟
44.数字序列中某一位的数字
参考链接
剑指 Offer 44. 数字序列中某一位的数字-跟着帅地玩转校招,刷爆各类算法题 - 帅地玩Offer
LCR 163. 找到第 k 位数字 - 力扣(LeetCode)
优秀题解
class Solution {
public int findKthNumber(int k) {
int digit = 1;
long start = 1;
long count = 9;
while (k > count) { // 1.
k -= count;
start *= 10;
digit += 1;
count = digit * start * 9;
}
long num = start + (k - 1) / digit; // 2.
return Long.toString(num).charAt((k - 1) % digit) - '0'; // 3.
}
}
作者:Krahets
链接:https://leetcode.cn/problems/shu-zi-xu-lie-zhong-mou-yi-wei-de-shu-zi-lcof/solutions/219252/mian-shi-ti-44-shu-zi-xu-lie-zhong-mou-yi-wei-de-6/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
看了题解后,尝试自己写了一遍,还是有挺多bug的
class Solution {
public static int findKthNumber(int k) {
int digit = 1;
// int start = 1; ❌ int 改成 long
long start = 1;
// int count = 9; ❌ int 改成 long
long count = 9;
while (k > count) {
k -= count;
start *= 10;
digit += 1;
count = digit * (9 * start);
}
// long num = start + k / digit - 1; ❌
// k = 10 --> k = k - 9 = 1, 1 / digit(2) - 1 = -1, (1 - 1) / digit = 0
long num = start + (k - 1) / digit;
String s = String.valueOf(num);
return (s.charAt((k - 1) % digit) - '0');
}
}
1 ~ 9,9个数字
10 ~ 99,(99 - 10 + 1)× 2 = 180 个数字
100 ~ 999,(999 - 100 + 1)× 3 = 2700 个数字
1000 ~ 9999,(9999 - 1000) × 4 = 36000 个数字
...
感觉得从大局把握规律,做题时只罗列了 0 ~ 30 数字,然后去寻找规律,没找到什么特殊规律(也有可能是自己没细心找,或者自己比较愚钝😂)
现在假设 k = 195,按照 Krahets 的思路去解题,具体步骤可为:
195 - 9 - 180 = 6 < 2700, k =6
(6 - 1) / 3 = 1, 即 101
(6 - 1) % 3 = 2, 即 101 中下标为 2 的数字
第n位 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | ||
---|---|---|---|---|---|---|---|---|---|---|
数字 | 9 | 9 | 1 | 0 | 0 | 1 | 0 | 1 |