1. 程式人生 > >【每天一道演算法題】恍如隔世

【每天一道演算法題】恍如隔世

時間過得真是好快,過了怎樣的一年半一言難盡

又到了找暑假實習的時候,翻出這個部落格作為午夜餘興

今天找了這麼一個題,不知道這趕腳像是高中數學題的題目還算不算演算法題,哈哈

給你這麼個數列
112123123412345123456123456712345678123456789123456789101234567891011...
看出規律了嗎 這個數列是由下列數列串合而成:
1
12
123
1234
12345
123456
1234567
12345678
123456789
12345678910
1234567891011
12345678910...
...

現在問題是給定1<=i<=2147483647
要求此數列的第i位

我的思路是這樣噠,這些數列串應該分類討論,最後一個數是1位的,最後一個數是2位的,最後一個數是3位的……

這樣就比較容易計算每個數列串的長度,由於i的範圍是有限度的,所以可以事先把以n位結尾的數列串的最大長度算出來,接下來就可以分情況討論啦

然後總數列也可以切分為這麼幾段來計算了:

設現在有k個數列串組成了整個數列

k是1位數的數列中,length = ( 1 + k ) * k / 2

k是2位數的數列中,length = ( 1 + 9 ) * 9 / 2 * ( 1 + k - 9 ) + 2 * ( 1 + k - 9 ) * ( k - 9 ) / 2

k是3位數的數列中,length = ( 1 + 9 ) * 9 / 2 * ( 1 + 99 - 9 ) + 2 * ( 1 + 99 - 9 ) * ( 99 - 9 ) / 2 + 3 * ( 1 + k - 99 ) * ( k - 99 ) / 2

.

.

.

然後算出k作為各個位數的最大長度,對於給出的i判定在哪個區間內,然後就可以代入計算i落在哪個k,k+1之間然後就容易計算啦~

就算這個傻部落格木有人看,算是自己對自己的督促吧~括弧笑~