剑指offer 44 数字序列中某一位的数字(类似题43)

题目描述

        数字以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;
}
  
   

猜你喜欢

转载自blog.csdn.net/weixin_41413441/article/details/81539252