题目描述
数字以01234567891011121314…的格式序列化到一个字符序列中。在这个序列中,第5位是5(从0开始),第13位是1,第19位是4,等等。请写一个函数,求任意第n位对应的数字。
分析:
最直观的方法就是从0开始逐一枚举每个数字。每枚举一个数字,就求出该数字是几位数,并把该数字的位数和前面所有数字的位数累加。如果位数之和仍然小于或者等于输入n,则继续枚举下一个数字。当累加的数位大于n时,那么第n位数字一定在这个数字里,再找出对应的那一位。
换种思路,我们可以跳过若干个数字,找数字见的规律来求对应的数字。以求序列中1001位为例:
序列的前10位是0~9,所以第1001位一定在10之后,因此这10个数可以直接跳过。我们再从后面紧跟的序列中找到第991(991=1001-10)位的数字。
接下来180位数字是10~99的两位数。由于991>180,所以第991位所有的两位数之后。我们再跳过90个两位数,继续从后面找881(881=991-180)位。
接下来的2700位是900个100~999的三位数中的一位。由于881<2700,所以第881位是某个三位数中的一位。由于881=270*3+1,这意味着第881位是从100开始的第270个数字370的中间位,也就是7。
int result(int index)
{
if(index<0)
return -1;
int digits=1;
while(true)
{
int numbers=countofinter(digits);//计算digits位 数字的个数
if(index<numbers*digits)
return digitatindex(index,digits); //当知道要找的数字位于digits位 数字中之后,找到那个数字
else
{
index-=numbers*digits;
digits++;
}
}
return -1;
}
int countofinter(int digits)
{
if(digits==1)
return 10;
int value=power(10,digits-1);
return 9*value;
}
int digitatindex(int index,int digits)
{
int number=beginnumber(digits)+index/digits;//找到要找的数字所在的整数,根据811=270*3+1写代码,所以100+270=370
int indexfromright=digits-index%digits;//找到要找的数字 右边的数字的个数(包括要找的数字本身)如 370,7的右边有2位
for(int i=1;i<indexfromright;i++)// 将要找的数字变成个位,然后取余求出即可。
index=index/10;
return index%10;
}
int beginnumber(int digits)//找到digits位数字 的开始部分,如2位数字开始部分是10,3位是100
{
if(digits==1)
return 0;
int val=power(10,digits-1);
return val;
}