【每日刷题】第N个数字

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sd4567855/article/details/86095535

day13, 第N个数字

题目来源:leetcode
在无限的整数序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, …中找到第 n 个数字。

注意:n 是正数且在32为整形范围内 ( n < 2^31)。

示例 1:
输入:
3
输出:
3

示例 2:
输入:
11
输出:
0

说明:第11个数字在序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, … 里是0,它是10的一部分。

解答:首先给第n个数字定位,看它处于哪一个区间,例如第8个数字处于[0,10)区间,第12个数字处于[10,99)区间。。依次推类。。之后以区间的左端作为起始点,开始遍历,每走一个数便加上该数拥有的位数,直到满足第n个数字为止,最后计算第n个数字再该数中的确切的位置。

代码:

class Solution {
public:
    vector<int> findigit( int n){
        int digit;
        vector<int> record;
        if( n==0){
            record.push_back(0);//number
            record.push_back(0);//digit
            return record;
        }
        else if( n > 0 && n <=9){
            record.push_back(1);//number_begin
            record.push_back(1);//digit
            return record;
        }
        else if( n > 9 && n <=189){
            record.push_back(10);//number
            record.push_back(2);//digit
            return record;
        }
        else if( n > 189 && n <=2889){
            record.push_back(190);//number
            record.push_back(3);//digit
            return record;
        }
        else if( n > 2889 && n <=38889){
            record.push_back(2890);//number
            record.push_back(4);//digit
            return record;
        }
        else if( n > 38889 && n <=488889){
            record.push_back(38890);//number
            record.push_back(5);//digit
            return record;
        }
        else if( n > 488889 && n <=5888889){
            record.push_back(488890);//number
            record.push_back(6);//digit
            return record;
        }
        else if( n > 5888889 && n <=68888889){
            record.push_back(5888890);//number
            record.push_back(7);//digit
            return record;
        }
        else if( n > 68888889 && n <=788888889){
            record.push_back(68888890);//number
            record.push_back(8);//digit
            return record;
        }
        else if( n > 788888889 && n <=8888888889){
            record.push_back(788888890);//number
            record.push_back(9);//digit
            return record;
        }
        return record;
    }

    int findNthDigit(int n) {
        vector<int> record = findigit(n);
        int begin;
        begin = record[ record.size() - 2];
        int digit = record[ record.size() - 1];

       // cout<<"begin = "<<begin<<"  digit = "<<digit<<endl;
        int i = 1;
        for(int k = 1; k < digit; k++)
            i*=10;
        //cout<<" i = "<<i<<endl;
        int j;
        for(j = begin ; j < n;){
            if( j + digit > n)
                break;
            else
                i++, j+=digit;
        }
        //cout<<" j = "<<j<<endl;
        string str = "";
        char strr[32] = {};
        sprintf(strr,"%d", i);
        for( int j = 0; j <strlen(strr); j++)
            str += strr[j];

        return str[ n - j] - '0';
    }
};

运行结果:啊啊啊,感觉自己快渣渣死了。。。。☹算法肯定需要优化。。。
image.png-22.3kB


我的微信公众号

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/sd4567855/article/details/86095535