题目取自LeetCode:
这道题目的意思为可以将所有的整数序列看成一个大字符串,找出这个大字符串中的第n位元素。比如示例2的含义为在字符串“1234567891011”中取第11个元素,即下标为10的元素,那么就是‘0’。
了解题目含义后我们可以根据这个含义来编写代码,但是直接搞出一个庞大的字符串并用下标方式寻找很不现实,因为题目要求中n的取值范围是
所以必须想别的办法找出数字。
观察这个字符串我们可以找到一个小规律,当数字为一位数字有(10-1)×1共9个小数字,当两位数字有(100-10)×2共180个小数字,当三位数字时一有(1000-100)×3共1800个小数字,所以我们可以根据这个规律来定位题目要求的大数字为多少,之后想找到具体的小数字就很容易了。
PS:有一个小细节就是题目n的取值范围达到了int类型的最大值,所以要用长整形来防一下溢出。
完整代码如下:
int findNthDigit(int n) {
long long num=0;//用长整型防溢出
int x=0;
while(num<n){//判断题目要求数字所在位置为几位数
num+=9*pow(10,x)*(x+1);
x++;
}
x--;
num-=9*pow(10,x)*(x+1);
n-=num;
int i=n/(x+1);//记录第几个数字
int j=n%(x+1);//记录所需数字位置
int v;
if(!j) v=pow(10,x)+i-1;
else v=pow(10,x)+i;//v即为定位的大数字,之后只需要根据j找到单个小数字输出即可
string s=to_string(v);//这里采用转换为string的方式快速寻找。
if(j)return s[j-1]-48;
else return s[x]-48;
}