1:题目描述
给你一个整数 n ,请你在无限的整数序列 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...] 中找出并返回第 n 位数字。
2:测试案例
测试案例1:
输入:n = 3
输出:3
测试案例2:
输入:n = 11
输出:0
解释:第 11 位数字在序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, … 里是 0 ,它是 10 的一部分。
提示:
1 <= n <= 2^31 - 1
3:解题思路
解释:返回第N位数,意思是把整数序列拼接,找到下标为【N-1】的整数,该整数是一位数(0-9),比如1 2 3 4 5 6 7 8 1 0 1 1 【10,11就是这么拆分】。
明白了题目的意思,接下来就是怎么解答这个题目
求解这个题,主要解决两个问题就可以:
1:找到n位是处于那个整数上的。
2:找到n位是出于这个整数的第几位。
4:代码解析
class Solution {
public:
int findNthDigit(int n) {
//使用二分查找法进行解答
//分析,由于n的限制。整数为数一定不会超过9位,以下整数【表示序列中的整数】
auto alg = [](int len)
{
int res = 0;
while (len>0)
{
res += (len * (9 * pow(10, len - 1)));//计算几位数计算公式
--len;
}
return res;
};
int low = 1, height = 9,mid =0;
while (height> low)
{
mid = (low + height) / 2;
//查找n位数的综合
if (alg(mid) >= n)
height = mid;
else
low = mid+1;
}
//能够定位整数
int temp = alg(low-1); //计算出一位的总数
//表示有几位 10 1表示第10位,0表示第11位
n -= temp;//表示位数
int index = (n +1)/low -1 ; //表示对应位数【整形是几位数】的 第几位整数
int index1 = (low==1?0: pow(10, (low-1))) + index; //得出正确的整数,对1位数进行特殊考虑,因为从1开始
int index2 = n % low; //算出位数
string temp1 = to_string(index1);
if (index2 == 0) //表示最后一位
{
return temp1[low - 1]-'0';
};
return temp1[index2 - 1] -'0';//前面low-1位
}
};
5:题目总结
本篇文章参考着官方解法,进行思考和解析,自己使用的是直接计算的方法。
时间和空间复杂度都可以,但由于对二分法的使用不够熟悉,因此写了这篇文章记录二分查找法的使用场景。