LeetCode 400. 第 N 位數字
阿新 • • 發佈:2021-12-01
Solution
首先找規律可以看出來每個位數\(digit\)的數字位數之和為\(sum_{digit}=digit*10^{digit-1}*9\),所以可以處理出第\(n\)位所在的數字\(value\),根據數字位數之和與\(n\)的關係,可以得出\(value\)的位數\(digit\),所以可以計算出\(digit-1\)以及之前的數位之和,根據\(digit\)位數又能確定出\(digit\)位數的最小值\(1\underbrace{0...00}_{digit-1}\),然後整除取餘計算出答案。
思路1:模擬確定\(digit\)的值
思路2:二分確定\(digit\)的值 (見程式碼)
埋骨何須桑梓地,人生無處不青山class Solution { public int findNthDigit(int n) { int l = 1, r = 9; while (l < r) { int mid = l + (r - l) / 2; if (preSum(mid) < n) { l = mid + 1; } else { r = mid; } } int digit = l; int begin = 1; for (int i = 0; i < digit - 1; i++) { begin *= 10; } int sufSum = n - preSum(digit - 1) - 1; String value = String.valueOf(begin + sufSum / digit); return value.charAt(sufSum % digit) - '0'; } public int preSum(int length) { int curLength = 1, sum = 0; while (curLength <= length) { sum += curLength * (int) Math.pow(10, curLength - 1) * 9; curLength++; } return sum; } }