400. 第 N 位数字

400. 第 N 位数字_第1张图片

链接:

​​​​​​400. 第 N 位数字

题解:

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

400. 第 N 位数字_第2张图片

400. 第 N 位数字_第3张图片

400. 第 N 位数字_第4张图片400. 第 N 位数字_第5张图片400. 第 N 位数字_第6张图片400. 第 N 位数字_第7张图片400. 第 N 位数字_第8张图片400. 第 N 位数字_第9张图片

class Solution {
public:
    int findNthDigit(int n) {
        int len=1;//初始数字长度为1
        int base=1;//初始范围为1~9
        while(n>(long)len*9*base){//如果n不在当前的数字范围内
            n-=len*9*base;//减去前面的数字的长度和
            len++;//下一轮计算的数字长度
            base*=10;//范围为之前的10倍
        }
        int index = n-1;//剩余的长度为n,这n个字符的编号是从0开始的,而我们要找的就是第n-1个字符
        int start = pow(10,len-1);//当前范围内的最小值
        int num = start+index/len;//寻找n对应的数字,用n除以数字长度就知道是从start开始的第几个数字了
        int digit = index%len;//寻找n对应的数字的第几位
        return int(num/pow(10,len-digit-1))%10;//取数字num的第digit位
        // char ch = to_string(num)[digit]; //转成字符串再输出也可以
        // return ch-'0';
    }
};
class Solution {
public:
    int findNthDigit(int n) {
        if (n <= 0) {
            return 0;
        }
        int len = 1;
        while (n > (long)9*(long)pow(10, len-1)) {
            n -= 9* (long)pow(10, len-1);
            ++len;
        }
        int index = n-1;
        int start = pow(10, len-1);
        int step = index/len;
        int num = start + step;
        int i = index%len;
        return to_string(num)[i] - '0';
    }
};

你可能感兴趣的:(leetcode,算法,数据结构)