題目描述
數字以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;
}