------------------------------------2021/1/25二刷---------------------------------------
除了wNum都用long
-------------------------------------一刷------------------------------------------
第一次遇到找规律的题目
解法 找规律
首先要知道题目所谓 第5位(从下标0开始计数)是5 的意思,其实简单来看,因为数字从0 开始,所以第n位就是前面有n个数
显然,需要分成 0 - 9 10 - 99 100 - 999的段来分析
这里直接借用大佬的图
根据以上分析,可将求解分为三步:
确定 n 所在 数字 的 位数 ,记为 wNum ;
确定 n 所在的 数字 ,记为 num ;
确定 n 是 num 中的哪一数位,并返回结果。
主要有三个求解过程
1.位数计算
while(n > count) {
n -= count;
wNum ++;
begin *= 10;
count = wNum * begin * 9;
}
这里有个处理技巧,把0个位数的count设为 10,这样偏移量就刚好。
2.获得当前数字
cur = begin + n/wNum;
3.获得位数所对应的数值
在思考C++怎么得到num中从左往右第n位数的过程中,发现从11开始C++也有toString函数了。看来得去看看现在的C++到底进步成怎么样了。
string s_num = to_string(cur);
return int(s_num[tmp] - '0');
4.完整代码
class Solution {
public:
int findNthDigit(int n) {
//0-9之间
if(n <= 9) return n;
//wNum : 位数 count :个数
int wNum = 1;
long begin = 1;
long count = 10;//设置0-9的count为十,这样第十个数字与10的偏移量就为0
while(n > count) {
n -= count;
wNum ++;
begin *= 10;
count = wNum * begin * 9;
}
//第几个数
long cur = begin + n/wNum;
//第几位
int tmp = n % wNum;
// 将该数字转为 string 类型
string s_num = to_string(cur);
// n 对应着第 tmp位,再转成 int
return int(s_num[tmp] - '0');
}
};
找规律的题目数字处理都比较困难,这题就磨了半天,还要继续努力