剑指offer第二版-44.数字序列中某一位的数字

本系列导航:剑指offer(第二版)java实现导航帖

面试题44:数字序列中某一位的数字

题目要求:
数字以01234567891011121314...的格式排列。在这个序列中,第5位(从0开始计)是5,第13位是1,第19位是4。求任意第n为对应的数字。

解题思路:
与43题类似,都是数学规律题。如果用遍历的方式,思路代码都很简单,但速度较慢。更好的方式是借助于数字序列的规律,感觉更像是数学题。步骤大致可以分为如下三部分:

以第15位数字2为例(2隶属与12,两位数,位于12从左侧以0号开始下标为1的位置)
步骤1:首先确定该数字是属于几位数的;
      如果是一位数,n<9;如果是两位数,n<9+90*2=189;
      说明是两位数。
步骤2:确定该数字属于哪个数。10+(15-10)/2= 12。
步骤3:确定是该数中哪一位。15-10-(12-10)*2 = 1, 所以位于“12”的下标为1的位置,即数字2。

以第1001位数字7为例
步骤1:首先确定该数字是属于几位数的;
      如果是一位数,n<9;如果是两位数,n<9+90*2=189;如果是三位数,n<189+900*3=2889;
      说明是三位数。
步骤2:确定该数字属于哪个数。100+(1001-190)/3= 370。
步骤3:确定是该数中哪一位。1001-190-(370-100)*3 = 1,所以位于“370”的下标为1的位置,即数字1。

package chapter5;

/**
 * Created with IntelliJ IDEA
 * Author: ryder
 * Date  : 2017/8/3
 * Time  : 8:50
 * Description:数字序列中某一位的数字
 **/
public class P225_DigitsInSequence {
    public static int digitAtIndex(int index){
        if(index<0)
            return -1;
        if(index<10)
            return index;
        int curIndex = 10,length = 2;
        int boundNum = 10;
        while (curIndex+lengthSum(length)

运行结果

9
1
0
1
1
1
2
7

你可能感兴趣的:(剑指offer第二版-44.数字序列中某一位的数字)