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所在数中的位置,直接返回即可,思路很好理解,但是其中有一些坑需要注意:
- 每次遍历要减去的长度时,可以定义三个变量,一个固定位数,一个固定个数,最后算出长度相减,也可以直接定义两个变量,一个固定位数,另一个就是长度,但是要注意别乘多了,每次遍历要把之前的位数消除再乘以新的位数;
- 获取目标数时,计算k位数中位置要注意向上取整,这样减一刚好是目标数;
- 定义的要减去的长度可能会越界,用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 438. 找到字符串中所有字母异位词 / 786. 第 K 个最小的素数分数 / 400. 第 N 位数字(优先队列,二分+双指针)