题目:
数字以0123456789101112131415的格式序列化到一个字符序列中。在这个序列中请写一个函数,求任意第n位对应的数字。
思路:
最直接的就是从0开始逐一枚举每一个数字,然后判断这个枚举的数字是几位,把前面枚举的数字长度加起来,然后判断加出来的和和所求的n的大小关系来判断在哪一个数里面,从而再判断n位是什么数字。
为了提高效率其实我么可以总结寻找一些规律来解决这个问题,比如前10位就是0-9,然后前190位就是0-99,前2890就是0-999的数,通过自行总结来寻找数字。
代码实现:
int findNthDigit(int n){
if (n < 10) {
return n;
}
long long int digit[][2] = {
{9, 1},
{180, 2},
{2700, 3},
{36000, 4},
{450000, 5},
{5400000, 6},
{63000000, 7},
{720000000, 8},
{8100000000, 9}
};
int target = n;
int pos = 0;
for (int i = 0; i < 9; ++i) {
if (n > digit[i][0]) {
target -= digit[i][0];
pos = digit[i][1] + 1;
} else {
break;
}
}
int num = pow(10, pos - 1) + (target - 1) / pos;
int idx = (target - 1) % pos;
char tmp[15] = {0};
sprintf(tmp, "%d", num);
return tmp[idx] - '0';
}