【LeetCode】400 Nth Digit(java實現)

原題連接

https://leetcode.com/problems/nth-digit/git

原題

Find the $n^th$ digit of the infinite integer sequence 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...code

Note: n is positive and will fit within the range of a 32-bit signed integer (n < 231).leetcode

Example 1:
Input:
3
Output:
3

Example 2:
Input:
11
Output:
0

Explanation:
The 11th digit of the sequence 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ... is a 0, which is part of the number 10.

題目要求

題目叫「第N個數字」,有一個從1到無限大的整形列表:1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...,求出第n個單數字。好比說第3個單數字是3,而第10個單數字是10的十位數,第11個單數字是10的個位數, 第12個單數字是11的十位數,以此類推。
爲了不混淆,我先說幾個我定義的概念,便於理解。實際數字,值得是這個整形列表中的實際數據,從1到無窮大;單數字指的是實際數字的每一個位數,如實際數字23有兩個單數字,分別爲2和3。get

解法

解法:這裏有這樣一個規律,從1到9,有9個只佔1個位數的數字,數字個數爲10 - 1 + 1;從10到99,有90個佔2個位數的數字,數字個數爲99 - 10 + 1,所以能夠獲得這樣的規律:it

範圍 佔位 個數 共佔位
1——9 1 9-1+1 = 9 9*1=9
10——99 2 99-10+1=90 90*2=180
100——999 3 999-100+1=900 900*3=2700
……

所以,若是要超照第n個單數字,首先要算出這個數字在哪一個區間範圍,在該範圍內每一個實際的數字佔幾個位,這個範圍內第一個實際數字前已經佔用了多少個單數字。而後,根據這些數據求出具體的值。io

public int findNthDigit(int n){
    // 該範圍內全部實際數字都佔用了digit個單數字
    int digit = 1;
    // 該範圍以前的全部實際數字已經佔用了totalDigit個單數字
    long totalDigit = 0;
    // 先查出區間範圍
    while (true) {
        long top = totalDigit + digit * 9 * (long)Math.pow(10, digit -1);
        if(n >= totalDigit && n <= top)
            break;
        totalDigit = top;
        digit++;
    }
    
    // 根據範圍算出具體的值
    int start = (int)Math.pow(10, digit - 1);
    int ret = 0;
    totalDigit += 1;
    // 第n個digit在哪一個具體的實際數字上
    int value = start + (n - (int)totalDigit) / digit;
    ret = Integer.toString((int)value).charAt((int)((n - totalDigit)%digit)) - '0';
    return ret;
}
相關文章
相關標籤/搜索