数字序列中某一位的数字
题目描述
数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从0开始计数)是5,第13位是1,第19位是4,等等。请写一个函数,求任意第n位对应的数字。
思路分析
最常规的做法:从0开始对每个数字求位数个数并累加,直至n位于累加的范围内,由此再具体求第n位对应的数字。常规做法是可行的,可其效率过低,应该有更好的做法。可以先考虑找规律:一位数0~9有10个,两位数10~99有2*90个(即180个),三位数100~999有3*900(即2700个)……以此类推:一个n位数有n*9*10^(n-1)个。至此我们可以通过此规律确定题目中的n是几位数,此外可以确定到n具体位于哪个数字上的第几位。例:当n为1001时,1001>10,则即求10为始端的第991位对应的数字,又991>180,则即求以100为始端的第881位对应的数字,再者811<2700,确定对应数字为3位数。由于811=3×270+1,则结果为以100开始的第270个数字即370的中间一位,也就是7.
代码如下:
public int getGitNum(int index){
if(index<0)return -1;
int count=10,git=1;
index-=count;
while(index>=0){
git++;
count=(int)(9*Math.pow(10,git-1)*git);
index-=count;
}
int left=index+count;
int num=(int)Math.pow(10,git-1)+left/git;
if(git==1)num--;
String strNum=Integer.toString(num);
return strNum.charAt(left%git)-'0';
}