[230521 剑指44] 数字序列中某一位的数字
一 题目
数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。
请写一个函数,求任意第n位对应的数字。
示例 1:
输入:n = 3
输出:3
示例 2:
输入:n = 11
输出:0
限制:
0 <= n < 2^31
二 整体思路
分为三个步骤:
- 迭代过程:找到 n 所对应的数字是几位数,用 digit 表示
- 找到 n 所对应的数字 num
- 在数字 num 中找到 n 所对应的位
三 关键点/重点/难点
**重难点在:**在第 2、3 步中,理解到在第 1 步的迭代结束后,n 为新的 n(可以理解为新的下标)
- 新的数字序列从 10 ^ (digit - 1) 开始,到 num 结束
- 对应的下标从 1 开始,到 n 结束
则第 2 步的计算公式为
int num = start + (n - 1) / digit;
第 3 步的计算公式为
int index = (n - 1) % digit;
string str = to_string(num)
int result = str[index] - '0';
**易错点在:**int 类型的 count 会发生上溢,应把 count 定义为 long long 类型。
四 代码分析
class Solution {
public:
int findNthDigit(int n) {
int start = 1; //1、10、100、...
int digit = 1;
long long count = 9;
//注意了,在这个迭代中,n和count都是变化的,只不过n是迭代的、count是计算的
while(n > count) {
n -= count;
start *= 10;
digit += 1;
count = (long long)digit * (pow(10, digit) - pow(10, digit - 1));
}
int num = start + (n - 1) / digit;
string str = to_string(num);
int index = (n - 1) % digit;
int result = str[index] - '0';
return result;
}
};
(五)一题多解
没有,能把这题找规律写出来就不错了
(六) 知识扩展
C++中的强制类型转换
int start, digit;
long long count;
//行
count = (long long)digit * (pow(10, digit) - pow(10, digit - 1));
//不行
count = long long(digit * (pow(10, digit) - pow(10, digit - 1)));
//不行
count = (long long)(digit * (pow(10, digit) - pow(10, digit - 1)));
C++求幂的函数
#include<cmath>
pow(底数, 指数);