题目描述
数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。
请写一个函数,求任意第n位对应的数字。
示例 1:
1 | 输入:n = 3 |
示例 2:
1 | 输入:n = 11 |
限制:
- $0 <= n < 2^31$
注意:本题与主站 400 题相同:https://leetcode-cn.com/problems/nth-digit/
算法
(数位统计) $O(logn)$
首先我们知道的是,1 位数有 10 个,2 位数有 9 个,3 位数有 9 * 10 个,4 位数有 9 * 100 个
注意:从 1 开始计数;先不考虑 0,那么一位数就变成 9 个
三步操作
- 确定是几位数,比如是三位数
- 确定是几位数的第几个数,比如是三位数的第 20 个数,即 100 + 20 - 1 = 119。
- 确定属于那个数的第几位
时间复杂度
总的时间复杂度即三步操作的时间复杂度
- int 的范围 $2*10^9$,所以最多是 10 位数,因此第一步操作的时间是 $O(1)$ 的
- 第二步除法向上取整,也是 $O(1)$ 的
- 第三步求是第几位数字是 $O(log_{10}n)$ 的
在二进制表示中取某一位可以每次右移 1 位(即除以 2),所以是 $O(log_2n)$ 级别的,
同理在十进制中取某一位可以每次右移 1 位(即除以 10),所以是 $O(log_{10}n)$ 级别的
空间复杂度
$O(1)$
C++ 代码
1 | class Solution { |