思路:
1、 按照位数分段,观察每一段的递归数量关系。
代码:方法1没有解决越界问题,方法2正确;
- 注意越界问题,该用double用double
- +1也会出现越界
public static void main(String[] args) {
System.out.println("123".charAt(1));
int a = 123;
System.out.println(String.valueOf(a).charAt(0));
System.out.println(findNthDigit(10));;
System.out.println(findNthDigit(10));;
System.out.println(findNthDigit(10));;
System.out.println(findNthDigit(1000));;
System.out.println(findNthDigit2(1000000000));;
System.out.println(findNthDigit2(2147483647));;
}
public static int findNthDigit(int n) {
if(n <= 9) return n;
int l =2;
int upBound = (int)(Math.pow(10 , l ));
int howMany = (int)(Math.pow(10 , l )) - (int)(Math.pow(10 , l-1 ));
int howManyDigits = howMany * l ;
int cur = 10 ;
/**先定位到几位数*/
while(cur <= n+1 - howManyDigits){
cur += howManyDigits;
l++;
howMany = (int)(Math.pow(10 , l )) - (int)(Math.pow(10 , l-1 ));
howManyDigits = howMany * l ;
}
int left = n+1 - cur;
/**定位第几个数字*/
int quotient = left/l;
int remainder = left % l;
int num = (int)(Math.pow(10,l-1)) + quotient -1;
if(remainder != 0) {
num ++;
return Integer.valueOf(String.valueOf(String.valueOf(num).charAt(remainder-1)));
}else {
String numStr = String.valueOf(num);
char c = numStr.charAt(numStr.length()-1);
return Integer.valueOf(String.valueOf(c));
}
}
public static int findNthDigit2(int n) {
if(n <= 9) return n;
int l =2;
int upBound = (int)(Math.pow(10 , l ));
double howMany = (int)(Math.pow(10 , l )) - (int)(Math.pow(10 , l-1 ));
double howManyDigits = howMany * l ;
double cur = 9 ;
/**先定位到几位数*/
while(cur <= n - howManyDigits){
cur += howManyDigits;
l++;
howMany = (Math.pow(10 , l )) - (Math.pow(10 , l-1 ));
howManyDigits = howMany * l ;
}
int left = (int) (n - cur);
/**定位第几个数字*/
int quotient = left/l;
int remainder = left % l;
int num = (int)(Math.pow(10,l-1)) + quotient -1;
if(remainder != 0) {
num ++;
return Integer.valueOf(String.valueOf(String.valueOf(num).charAt(remainder-1)));
}else {
String numStr = String.valueOf(num);
char c = numStr.charAt(numStr.length()-1);
return Integer.valueOf(String.valueOf(c));
}
}