题解 | #数字序列中某一位的数字#

数字序列中某一位的数字

https://www.nowcoder.com/practice/29311ff7404d44e0b07077f4201418f5

#include <string>
class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param n int整型
     * @return int整型
     */
    int findNthDigit(int n) {
        if (n == 0) {
            return 0;
        }
        // 从1位数开始算起
        // 1位数中抛开0所占的数位数是9
        // k(k>1)位数所占的数位数 = 9 * pow(10,k) * k
     
        int k = 1; // 当前数位量级
        //下面两个变量要设置为long类型,否则会出现数据溢出的问题。
        long long sum = 9; // 当前数位的数字个数
        long long  start = 1; //当前数位的初始数字
        while (n > sum) {
            n -=  sum;
            k++;
            start = start * 10;
            sum = 9 * start * k;
        }
        // 此时n<=sum. 表明第n位数字所在的数是k位数,
        int num = start + (n-1) / k;
        int digitIndex = (n-1) % k;
        return to_string(num)[digitIndex] - '0';


    }
};

每一道题需要最后形成一个连贯的逻辑,题目有关键点。解决每一个关键点的方法是什么?

关键点一:第n位(下标从0开始算起)数字所在的数是几位数?

注:由于下标从0开始算起,很自然就忽略掉了0. 所以可以将n当做去掉0之后从1开始算起的下标。

判断方法:需要知道前k位数字所占的数位数目,那就需要知道第i(i = 1,2,3,...)位数字所占的数位数,然后进行累加,判断n-已经累加过的数位数的剩余数位数是否超过当前数位所占的数位数。

关键点二:假设第n位数字所在的数是k0位数,那么k0位数的起始数字是多少?第n位数字所在的数是k0位数中的第几个数字?假设这个数为num, 第n位数字位于num的第几位?

判断方法:k0位数的起始数字是1 pow(10, k0-1) := start

(n - 前(k0-1)位数所占的位数总和) / k0, 就是该数字的编号, 记作index

num = start + index

设第n位数字位于num的digitIndex位,则digitIndex = (n - 前(k0-1)位数所占的位数总和) % k0

全部评论

相关推荐

05-29 20:34
门头沟学院 C++
KarlAllen:得做好直接春招的准备。学历差的话,一是面试要求会比学历好的严格不少,二是就算面试通过了也会被排序。总之暑期和秋招对于学历差的就是及其不友好
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务