1. 程式人生 > >Nth Digit 第N個數字

Nth Digit 第N個數字

在無限的整數序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...中找到第 個數字。

注意:
是正數且在32為整形範圍內 ( n < 231)。

示例 1:

輸入:
3

輸出:
3

示例 2:

輸入:
11

輸出:
0

說明:
第11個數字在序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ... 裡是0,它是10的一部分。

思路:這道題分三步走,同時還要注意一些邊界條件和坑。

步驟1:找到位於第幾個序列(1~9為第一個序列,10~99為第二個序列,100~999為第三個序列,以此類推)

步驟2:找到位於序列的第幾個數

步驟3:找到位於第幾個數的第幾位

步驟一詳解:1~9有9個數,10~99有90個數,100~999有900個數,所以第n個序列有9*10*n個數

步驟二詳解:比如已經定位到第三個序列,因為第三個序列每個數字都有三位,所以通過除三來定位在第幾個數

步驟三詳解:如何定位到第幾位呢?可以通過取餘的方法來定位,同理,依然是通過對3取餘

參考程式碼:

class Solution {
public:
    //1~9 9個,10~99 90個,100~999 900個
    int findNthDigit(int n) {
        //先找到處在第幾個序列,第一個序列1~9,第二個序列10~99,以此類推。。。
        int weight = 1;
        int index = 1;
        long long sum = 9 * weight*index;
        while ((((float)n)/sum) >1.0) {
            n -= sum;
            weight *= 10;
            index++;
            sum= 9 * weight*index;
        }
        //然後找位於序列的哪個數
        string nth = to_string(((n - 1) / index) + weight);
        //然後找到哪個數的第幾位
        return nth[((n - 1) % index)] - '0';
    }
};