原题
题解
方法一
暴力法。此方法超时
代码示例:
class Solution {
public int findNthDigit(int n) {
String s="";
int i=0;
while(true){
i++;
s+=i;
if(s.length()>=n){
return s.charAt(n-1)-'0';
}
}
}
}
//示例17000,用时888ms,答案3
//34 / 70 个通过测试用例 状态:超出时间限制 最后执行的输入: 1000000
//2020.06.25
方法二
利用数学方法,先确定所求数字位于多少位的数里面,再确定是第几个那么多位数以及数里面的第几个数字。
本方法java代码示例:
/*
*@v7fgg
*执行用时:6 ms, 在所有 Java 提交中击败了8.53%的用户
*内存消耗:36.6 MB, 在所有 Java 提交中击败了50.00%的用户
*2020年6月25日 19:48
*/
class Solution {
public int findNthDigit(int n) {
int i=0;
while(n>9*(i+1)*Math.pow(10,i)){
n-=9*(i+1)*Math.pow(10,i);
i++;
}
return ((int)Math.pow(10,i)+(n-1)/(i+1)+"").charAt((n-1)%(i+1))-'0';
}
}
如果循环中不用pow函数:
/*
*@v7fgg
*执行用时:5 ms, 在所有 Java 提交中击败了11.53%的用户
*内存消耗:36.7 MB, 在所有 Java 提交中击败了50.00%的用户
*2020年6月25日 20:13
*/
class Solution {
public int findNthDigit(int n) {
int i=0;
long q=9;//注意越界问题
while(n>q){
n-=q;
q=q/(i+1)*10*(i+2);
i++;
}
return ((int)Math.pow(10,i)+(n-1)/(i+1)+"").charAt((n-1)%(i+1))-'0';
}
}