image.png

    思路:
    1、 按照位数分段,观察每一段的递归数量关系。
    代码:方法1没有解决越界问题,方法2正确;

    • 注意越界问题,该用double用double
    • +1也会出现越界
    1. public static void main(String[] args) {
    2. System.out.println("123".charAt(1));
    3. int a = 123;
    4. System.out.println(String.valueOf(a).charAt(0));
    5. System.out.println(findNthDigit(10));;
    6. System.out.println(findNthDigit(10));;
    7. System.out.println(findNthDigit(10));;
    8. System.out.println(findNthDigit(1000));;
    9. System.out.println(findNthDigit2(1000000000));;
    10. System.out.println(findNthDigit2(2147483647));;
    11. }
    12. public static int findNthDigit(int n) {
    13. if(n <= 9) return n;
    14. int l =2;
    15. int upBound = (int)(Math.pow(10 , l ));
    16. int howMany = (int)(Math.pow(10 , l )) - (int)(Math.pow(10 , l-1 ));
    17. int howManyDigits = howMany * l ;
    18. int cur = 10 ;
    19. /**先定位到几位数*/
    20. while(cur <= n+1 - howManyDigits){
    21. cur += howManyDigits;
    22. l++;
    23. howMany = (int)(Math.pow(10 , l )) - (int)(Math.pow(10 , l-1 ));
    24. howManyDigits = howMany * l ;
    25. }
    26. int left = n+1 - cur;
    27. /**定位第几个数字*/
    28. int quotient = left/l;
    29. int remainder = left % l;
    30. int num = (int)(Math.pow(10,l-1)) + quotient -1;
    31. if(remainder != 0) {
    32. num ++;
    33. return Integer.valueOf(String.valueOf(String.valueOf(num).charAt(remainder-1)));
    34. }else {
    35. String numStr = String.valueOf(num);
    36. char c = numStr.charAt(numStr.length()-1);
    37. return Integer.valueOf(String.valueOf(c));
    38. }
    39. }
    40. public static int findNthDigit2(int n) {
    41. if(n <= 9) return n;
    42. int l =2;
    43. int upBound = (int)(Math.pow(10 , l ));
    44. double howMany = (int)(Math.pow(10 , l )) - (int)(Math.pow(10 , l-1 ));
    45. double howManyDigits = howMany * l ;
    46. double cur = 9 ;
    47. /**先定位到几位数*/
    48. while(cur <= n - howManyDigits){
    49. cur += howManyDigits;
    50. l++;
    51. howMany = (Math.pow(10 , l )) - (Math.pow(10 , l-1 ));
    52. howManyDigits = howMany * l ;
    53. }
    54. int left = (int) (n - cur);
    55. /**定位第几个数字*/
    56. int quotient = left/l;
    57. int remainder = left % l;
    58. int num = (int)(Math.pow(10,l-1)) + quotient -1;
    59. if(remainder != 0) {
    60. num ++;
    61. return Integer.valueOf(String.valueOf(String.valueOf(num).charAt(remainder-1)));
    62. }else {
    63. String numStr = String.valueOf(num);
    64. char c = numStr.charAt(numStr.length()-1);
    65. return Integer.valueOf(String.valueOf(c));
    66. }
    67. }