数字序列中某一位的数字
题目
数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。
请写一个函数,求任意第n位对应的数字。
思路 参考leetcode题解:
对于第n位对应的数字,令这个数字对应的数为target,然后分三步进行:
- 首先找到这个数字对应的数是几位数,用digit表示,digit=3即number是3位数
- 然后确定所属的number的值
- 最后确定需要返回的值是target中的哪一位
比如输入的n是365:
(1)算出digit=3:
n
=
365
−
0
−
90
×
2
=
176
n=365-0-90×2=176
n=365−0−90×2=176,即n是三位数中的第176个数字
(2)设目标所在的数为number,计算得到
n
u
m
b
e
r
=
100
+
176
/
3
=
158
number=100+176/3=158
number=100+176/3=158,而idx表示返回值在number中的位置,idx=0表示是number的最后一位
(3)
i
d
x
=
n
%
d
i
g
i
t
=
176
%
3
=
2
idx = n %digit = 176%3 =2
idx=n%digit=176%3=2,即目标数字是158的第二位5。
C++
class Solution {
public:
int findNthDigit(int n) {
// 确定number的位数digit
long base = 9, digit = 1;
while(n-base*digit>0)
{
n -= base*digit;
base *= 10;
++digit;
}
// 计算真实代表的数字number
int idx = n % digit;
if (idx==0) //此时为number的最后一位,number是digit位数,idx=digit
idx = digit;
long number = 1;
for (int i=1; i<digit; ++i)
number*=10;
number += (idx==digit)? n/digit-1:n/digit;
//找到res
for (int i=idx; i<digit; ++i)
number/=10;
return number%10;
}
};
python
class Solution:
def findNthDigit(self, n: int) -> int:
# 先判断target属于几位数, 用digit表示
base = 9
digit = 1
while n-base*digit>0:
n -= base*digit
base *= 10
digit += 1
# 计算目标数字,此时n表示digit位数的第n个数字
idx = n % digit
if idx==0:
idx = digit
number = 1
for i in range(1, digit):
number *= 10
if idx == digit:
number += n//digit - 1
else:
number += n//digit
# 找到target中对应的数字
for i in range(idx, digit):
number //= 10
return number % 10