400. 第 N 位数字

343 阅读1分钟

这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战

400. 第 N 位数字

在无限的整数序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...中找到第 n 位数字。

注意:n 是正数且在 32 位整数范围内(n < 231)。

示例 1:

输入:3 输出:3 示例 2:

输入:11 输出:0 解释:第 11 位数字在序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ... 里是 0 ,它是 10 的一部分

解题思路

  1. 首先我们需要知道要找的那个第N位数字有是位于序列中的哪个元素。 1-9有1 * 9个数字, 10-99有2 * 90个数字, 100-999有3 * 900个数字。 通过这个规律我们就知道我们要找的数字具体属于哪个数的一部分。 例如输入的 n 是 11, 第 11 位数字在序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ... 里是具体是属于10的一部分。

  2. 再从序列元素中寻找对应的位 例如输入的 n 是 11: 第 11 位数字在序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...。上一步中就求出了我们的目标值位于序列元素10里面,元素10的前面有9个数字,而我们需要查找的目标是11,因此我们再从10里面,找出第(11-9)位(第二位)为0,所以我们找到的第N位就是0.

  • num记录当前的数字
  • dig记录位数,我们的数字是从一位数,二位数...这样递增的
  • base代表当前位数拥有多少个数字,比如有9个个位数,90个二位数

因此我们只要不断地遍历一位数、二位数,找出我们目标位所在在数字为num 再计算出我们需要的目标位在num中的下标

代码

class Solution {
    public int findNthDigit(int n) {

        long base=9,dig=1;
        int num=0;
        while(n>base*dig)
        {
            n-=base*dig;
            num+=base;
            base*=10;
            dig++;
        }
        num+=(n-1)/dig+1;
        long idx=(n-1)%dig+1;
        while(dig-->idx)
            num/=10;
        return num%10;
    }
}