剑指offer--c++--数字序列中某位数的数字

题目:

       数字以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;
}

 

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读