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

题目

数字以012345678910111213141516171819.......的格式序列化到一个符号序列中。在这个序列中,第5位(从0开始计数)是5,第13位是1,第19位是4等等。请写一个函数,求任意第n位对应的数字

解题思路

比如,序列的第1001位是什么?

  1. 序列的前10位是0~9这10个只有一位的数字。显然第1001位在10个数字之后,我们应再从后面紧跟着序列找第991(991=1001-10)位的数字。
  2. 接下来180位数字是90个10~99的两位数。同理,因为991位在所有两位数之后,故继续从后面找881(881=991-180)
  3. 接下来2700位是900个100~999的三位数。由于811<2700,所以第811位是某个三位数中的一位,因为811=2703+1*,这意味着第811位是从100开始的第270个数字即370的中间一位,即7

代码

countOfIntegers计算出m位的数字对应多少数字,即2位的数字对应90个两位数

int countOfIntegers(int num)
{
    int sum = 1;
    if(num == 1)
    {
        return 10;
    }
    else
    {
        int i = num;
        while(i > 1)
        {
            sum = sum *10;
            i--;
        }
    }
    return 9*sum*(num-1);
    //return 9*pow(10,num-1);
}

1)判断给出的整数符合几位数,然后找到位数digits

int digitAtIndex(unsigned int index)
{
    if(index < 0)
    {
        return -1;
    }
    int digits = 1;
    while(true)
    {
        int numbers = countOfIntegers(digits);
        if(index < numbers * digits)
        {
            return digitAtIndex(index,digits);
        }
        index = index - digits*numbers;
        digits++;
    }
    return -1;
}

2)根据位数和在该位数的偏移量index,找出具体的对应值

int beginNumber(int digits)
{
    if(digits == 1)
    {
        return 0;
    }
    return (int)pow(10,digits-1);
}

int digitAtIndex(int index,int digits)
{
    int number = beginNumber(digits) + index/digits; 
    int indexFromRight = digits - index%digits;
    for(int i = 1;i

完整代码见GitHub

你可能感兴趣的:(面试题44:数字序列中某一位的数字)