LeetCode 400. 第 N 位数字

传送门

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;
    }
}
埋骨何须桑梓地,人生无处不青山
原文地址:https://www.cnblogs.com/ACMerszl/p/15630345.html