44. 数字序列中某一位的数字
1 题目描述
数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。
请写一个函数,求任意第n位对应的数字。
2 题目分析
思路:找规律题。
将数字序列如下划分,很容易将1-9,10-99,100-999,…这些类别,digit表示位数,start表示起始元素,则每个区间元素总数就有如下规律:
count = start * 9 * digit
解题步骤:
- 确认输入n所在的位数digit,通过while(n > count)去判断,当n>count时,说明第n位的元素不在该区间中,因此更新n为n-count
- 确认n,由于n是变化的,因此此时的n是从起始数start开始的,易知所在位在数字num=start+(n-1)/digit中
- 求最终结果,有个巧妙地解法:n表示从start开始计算的第n-1个位置(从0开始数),而前面的数字个数都是digit的倍数,因此我们可知,num的第(n-1)%digit个位置的元素就是所求最终结果
3 代码
int findNthDigit(int n) {
// 1. 初始化:1-9的情况
long start = 1;
int digit = 1;
long count = 9;
while (n > count) {
n -= count;
start *= 10;
digit += 1;
count = digit * start * 9;
}
// 2. 求第n位在哪个数字中
long num = start + (n - 1) / digit;
// 3. 求最终结果,index表示结果在num的第index个位置
int index = (n - 1) % digit;
return Long.toString(num).charAt(index) - '0';
}