• 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;
        }
    }
    
    埋骨何须桑梓地,人生无处不青山
  • 相关阅读:
    如何快速转载CSDN及博客园中的博客
    Ubuntu18.04连不网 报"有线连接未托管"
    Ubuntu18.04的网络配置
    vim基本操作
    Git更新远程仓库代码到本地(转)
    POJ 3253 Fence Repair
    POJ 2503 Babelfish
    POJ 2002 Squares
    POJ 1840 Eqs
    POJ 3274 Gold Balanced Lineup
  • 原文地址:https://www.cnblogs.com/ACMerszl/p/15630345.html
Copyright © 2020-2023  润新知