在无限的整数序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...中找到第 n 个数字。
注意:
n 是正数且在32为整形范围内 ( n < 231)。
示例 1:
输入: 3 输出: 3
示例 2:
输入: 11 输出: 0 说明: 第11个数字在序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ... 里是0,它是10的一部分。
思路:这道题分三步走,同时还要注意一些边界条件和坑。
步骤1:找到位于第几个序列(1~9为第一个序列,10~99为第二个序列,100~999为第三个序列,以此类推)
步骤2:找到位于序列的第几个数
步骤3:找到位于第几个数的第几位
步骤一详解:1~9有9个数,10~99有90个数,100~999有900个数,所以第n个序列有9*10*n个数
步骤二详解:比如已经定位到第三个序列,因为第三个序列每个数字都有三位,所以通过除三来定位在第几个数
步骤三详解:如何定位到第几位呢?可以通过取余的方法来定位,同理,依然是通过对3取余
参考代码:
class Solution {
public:
//1~9 9个,10~99 90个,100~999 900个
int findNthDigit(int n) {
//先找到处在第几个序列,第一个序列1~9,第二个序列10~99,以此类推。。。
int weight = 1;
int index = 1;
long long sum = 9 * weight*index;
while ((((float)n)/sum) >1.0) {
n -= sum;
weight *= 10;
index++;
sum= 9 * weight*index;
}
//然后找位于序列的哪个数
string nth = to_string(((n - 1) / index) + weight);
//然后找到哪个数的第几位
return nth[((n - 1) % index)] - '0';
}
};