[LeetCode]剑指 Offer 44. 数字序列中某一位的数字

Posted Spring-_-Bear

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[LeetCode]剑指 Offer 44. 数字序列中某一位的数字相关的知识,希望对你有一定的参考价值。

数字以 0123456789101112131415… 的格式序列化到一个字符序列中。在这个序列中,第 5 位(从下标 0 开始计数)是 5,第 13 位是 1,第 19 位是 4,等等。

请写一个函数,求任意第 n 位对应的数字。

示例 1:

输入:n = 3
输出:3

示例 2:

输入:n = 11
输出:0

限制:

  • 0 <= n < 2^31

题解:

  1. 将 101112⋯ 中的每一位称为数位 ,记为 n
  2. 将 10,11,12,⋯ 称为数字 ,记为 num
  3. 数字 10 是一个两位数,称此数字的位数 为 2 ,记为 digit
  4. 每 digit 位数的起始数字(即:1,10,100,⋯),记为 start


观察上表,可推出各 digit 下的数位数量 count 的计算公式:count = 9 × start × digit

根据以上分析,可将求解分为三步:

  1. 确定 n 所在数字的位数 digit
  2. 确定 n 所在的数字 num
  3. 确定 n 是 num 中的哪一数位,并返回结果
  1. 确定所求数位的所在数字的位数

    如下图所示,循环执行 n 减去一位数、两位数、… 的数位数量 count ,直至 n ≤ count 时跳出。

    由于 n 已经减去了一位数、两位数、…、(digit−1) 位数的数位数量 count ,因而此时的 n 是从起始数字 start 开始计数的。

    digit, start, count = 1, 1, 9
    while n > count:
    n -= count
    start *= 10 # 1, 10, 100, ...
    digit += 1  # 1,  2,  3, ...
    count = 9 * start * digit # 9, 180, 2700, ...
    

    结论: 所求数位 ① 在某个 digit 位数中; ② 为从数字 start 开始的第 n 个数位。

  2. 确定所求数位所在的数字

    如下图所示,所求数位在从数字 start 开始的第 [(n − 1) / digit] 个 数字 中(start 为第 0 个数字)。

    num = start + (n - 1) // digit
    

    结论: 所求数位在数字 num 中。

  3. 确定所求数位在 num 的哪一数位
    如下图所示,所求数位为数字 num 的第 (n − 1) % digit 位( 数字的首个数位为第 0 位)。

    s = str(num) # 转化为 string
    res = int(s[(n - 1) % digit]) # 获得 num 的 第 (n - 1) % digit 个数位,并转化为 int
    

    结论: 所求数位是 res。

示例:



	/**
     * 剑指 Offer 44. 数字序列中某一位的数字
     */
    public int findNthDigit(int n) 
        // 数字 num 的位数为 digit,num=1 时 digit=1, num=20 时 digit=2......
        int digit = 1;
        // 一位数 start=1,两位数 start=10,三位数 start=100......
        long start = 1;
        // digit 位数的 num 个数,一位数 count=9, 两位数 count=99-10+1=90......
        long count = 9;

        // 求得数位 n 对应 digit 和 start
        while (n > count) 
            n -= count;
            digit++;
            start *= 10;
            count = digit * start * 9;
        

        // 求得数位 n 对应的数字 num
        long num = start + (n - 1) / digit;
        
        // 返回数位 n 对应的数字
        return Long.toString(num).charAt((n - 1) % digit) - '0';
    

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/shu-zi-xu-lie-zhong-mou-yi-wei-de-shu-zi-lcof

以上是关于[LeetCode]剑指 Offer 44. 数字序列中某一位的数字的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode(剑指 Offer)- 44. 数字序列中某一位的数字

[LeetCode]剑指 Offer 44. 数字序列中某一位的数字

[LeetCode]剑指 Offer 44. 数字序列中某一位的数字

LeetCode993. 二叉树的堂兄弟节点 / 剑指 Offer 44. 数字序列中某一位的数字 / 剑指 Offer 45. 把数组排成最小的数

剑指 Offer 44. 数字序列中某一位的数字

LeetCode 剑指 Offer 11. 旋转数组的最小数字 | Python