给你一个整数 n ,请你在无限的整数序列 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, …] 中找出并返回第 n 位上的数字。
示例 1:
输入:n = 3
输出:3
示例 2:
输入:n = 11
输出:0
解释:第 11 位数字在序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ... 里是 0 ,它是 10 的一部分。
这道题的意思就是在一个数组里面 数字按1,2.。。排列的 我们要把里面的每个数字都当作是一位
比如100它就包含了3位 1 0 0,示例2里面的给的n=11 我们找到了10 的第二位是第11个数
解:
我们可以通过我们的经验知道 这些数根据他们的位数的分布:
1-9 9个 位数1 起始值 pow(10,0); 个数 pow(10,0)*9
10-99 90个 位数2 起始值 pow(10,1); 个数 pow(10,1)*9
100-999 900个 位数3 .起始值 pow(10,2); 个数 pow(10,2)*9。。。。
通过上述例子我们可以看出 它的起始值和位数有着极大的关系 甚至说它的个数也和位数有关系,通过这些关系我们可以通过一个for循环判断它是几位数,然后通过它剩余的值来获取它具体值以及索引项 从而获取值 下面是代码
class Solution {
public int findNthDigit(int n) {
if(n<10){//小于10直接将给的n返回
return n;
}
n=n-9;//没有小于10先减去1-9的9位
for(int i=1;i<n;i++){//此处不需要在意为什么循环n次,只是为了不让循环在获取答案前结束而设置的一个较大的值
long temp=(long)Math.pow(10,i);//看当前的起始的值为多少
if(n<=(9*temp)*(i+1)){//起始为乘以位数就是它占的索引 比如 100-999 占的索引 900*3
long end=0L;
end=temp+(n+1)/(i+1)-1;//当前你所需要的数字是几 因为我们需要向上取整所以加了1
String result=String.valueOf(end);
return result.charAt((n-1)%(i+1))-'0';//减一是因为需要让它成为0序的
}
n=(int) (n-9*temp*(i+1));//没在这几位直接减一下 进入下一次循环
}
return n;//无实际意义 只是为了不让编译器报错 根本执行不到这里
}
}
本题是在leecode上做的 此处附上网址:
https://leetcode-cn.com/problems/nth-digit