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