LeetCode 400 第N位数字[数学 逻辑] HERODING的LeetCode之路

Posted HERODING23

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 400 第N位数字[数学 逻辑] HERODING的LeetCode之路相关的知识,希望对你有一定的参考价值。

解题思路

首先仔细审题,再看看用例你才能理解题目的真正意思,其实就是你把数组的逗号去掉,在组合的字符串中找第n位数即可,接着就是找规律,很容易知道,个位数有9个,十位数有90个,百位数有900个,以此类推。规律找出思路就容易了,我们从个位数,十位数一直往后判断,确定目标n所在的数到底是几位数,确定为k位数后,n把前k-1位的所有数的位数都减去,这时候n所在的数就明晰了,为所在位数的初始数(比如1,10,100)加上还剩下位数与所在位的比值(即在k位数中的位置)即可,剩下位数与所在位数的余数就是n所在数中的位置,直接返回即可,思路很好理解,但是其中有一些坑需要注意:

  1. 每次遍历要减去的长度时,可以定义三个变量,一个固定位数,一个固定个数,最后算出长度相减,也可以直接定义两个变量,一个固定位数,另一个就是长度,但是要注意别乘多了,每次遍历要把之前的位数消除再乘以新的位数;
  2. 获取目标数时,计算k位数中位置要注意向上取整,这样减一刚好是目标数;
  3. 定义的要减去的长度可能会越界,用long long定义可以保证万无一失。

代码如下:

代码

class Solution 
public:
    int findNthDigit(int n) 
        long long len = 9;
        int digit = 1;
        // 遍历到n位数字所在的k位数(个位数,十位数,百位数)
        while(n > len) 
            n -= len;
            // 防止下面多乘了位数
            len /= digit;
            digit ++;  
            len *= 10 * digit;
        
        // 找到具体的数
        int num = pow(10, digit - 1) + ceil(n * 1.0 / digit) - 1;
        // 找到具体数中的位数
        int rest = (n - 1) % digit;
        string res = to_string(num);
        return res[rest] - '0';
    
;

以上是关于LeetCode 400 第N位数字[数学 逻辑] HERODING的LeetCode之路的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 400. 第 N 位数字(找规律,Java)

LeetCode(算法)- 400. 第 N 位数字

LeetCode(算法)- 400. 第 N 位数字

LeetCode(算法)- 400. 第 N 位数字

LeetCode﹝数学规律ி﹞第N位数字可怜的小猪

LeetCode 438. 找到字符串中所有字母异位词 / 786. 第 K 个最小的素数分数 / 400. 第 N 位数字(优先队列,二分+双指针)