劍指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;
}
  
   

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章