【LeetCode & 剑指offer刷题】特殊数题2:44 数字序列中某一位的数字(400. Nth Digit)
【LeetCode & 剑指offer 刷题笔记】目录(持续更新中...)
400. Nth Digit
Find the
n
th
digit of the infinite integer sequence 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...
Note:
n
is positive and will fit within the range of a 32-bit signed integer (
n
< 2
31
).
Example 1:
Input:
3
Output:
3
Example 2:
Input:
11
Output:
0
Explanation:
The 11th digit of the sequence 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ... is a 0, which is part of the number 10.
/*
分析:
1~9: 9
10~99:90*2
100~999:900*3
*/
#include <cmath>
class
Solution
{
public
:
int
findNthDigit
(
int
n
)
{
if
(
n
<
0
)
return
0
;
//计算目标数的位数
int
digits
=
1
;
//单个数的位数
long
base
=
9
;
//某位数的个数 ,为了满足题目n的范围要求,设置为long型
while
(
n
-
base
*
digits
>
0
)
{
n
-=
base
*
digits
;
//不断减去k位数的个数,直到到目标数的位数
base
*=
10
;
digits
++;
//当前位数
}
//跳出循环时,digits为目标数位数,n为剩余需要计数的总位数
//计算是哪个目标数
int
firstnum
=
pow
(
10
,
digits
-
1
);
//当前数位中第一个数,如1、10、100
int
objnum
=
firstnum
;
int
index
=
n
%
digits
;
//index标识要找的数在目标数中哪个位置(从左往右数)
if
(
index
==
0
) //说明在目标数的最后一位
{
index
=
digits
;
objnum
=
firstnum
+
n
/
digits
-
1
;
//注意减1,如100,n = 3,则在100最后一位
}
else
objnum
=
firstnum
+
n
/
digits
;
//如 n=4,则在101第一位
//找出是目标数中哪个数字
for
(
int
i
=
index
;
i
<
digits
;
i
++)
objnum
/=
10
;
//除到目标位为个位
return
objnum
%
10
;
}
};