题目:
数字以0123456789101112131415...的格式序列化到一个字符串序列中。这个字符串,第5位是5(从0开始计数),第13位是1,第19位是4。请写出一个函数,求任意第n位数。
解题思路:
先确定n的范围,然后减去前面的范围,除上位数,(同时取余位数),求出该范围内的数,在加上之前的范围真实数,就是真实要显示的那个数字。取余位数后,得到的是显示第几位(从左往右,从0开始计数)
参考代码:
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <stack>
#include <queue>
#include <list>
#include <unordered_map>
#include <cstring>
#include <map>
using namespace std;
class Solution {
public:
long long f[10] = {0,10,190,2890,38890,488890,5888890,68888890,788888890,8888888890};
int find_Solution(int index)
{
//0~9要单独处理,不符合下面的公式
if (index <= 0)
return 0;
if (index <= 9)
return index;
int w_data = 0;
//先算位数,判断在哪个范围
for (int i = 1; i < 10; ++i) {
if (index <= f[i])
{
w_data = i;
break;
}
}
index -= f[w_data-1];
int temp1 = index/w_data; //在某个范围内真实的数
int temp2 = index%w_data; //要显示的位数
int real_data = pow(10,w_data-1) + temp1;//求出真实的数
return (find_w(real_data,(w_data-temp2)));//实现位数
}
//获取从右往左第n位,从1开始
int find_w(int origin, int n)
{
int res = origin;
if (n != 1)
{
while (n > 1)
{
--n;
origin /= 10;
res = origin%10;
}
} else
res = origin%10;
return res;
}
};
int main()
{
Solution solution;
cout<<solution.find_Solution(1001)<<endl;
return 0;
}