Nth digit

update Jun 30, 2017 12:08

leetcode Find the nth digit of the infinite integer sequence 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...

Note: n is positive and will fit within the range of a 32-bit signed integer (n < 231).

Example 1:

    Input:
    3

    Output:
    3
    Example 2:

    Input:
    11

    Output:
    0

Explanation: The 11th digit of the sequence 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ... is a 0, which is part of the number 10.

思路:

利用1-9有一位,10-99有两位,以此类推往后面数,但是code的细节太多,要注意。

Java code:

    //java
    public class Solution {
        public int findNthDigit(int n) {
            int size = 1;
            long step = 9;
            long prob = 9;
            int start = 1;
            while (n > prob) {
                size += 1;
                step *= 10;
                start *= 10;
                n -= prob;
                prob = step * size;
            }
            long number = start + (n - 1) / size;
            int pos = (n - 1) % size;
            return (number + "").charAt(pos) - '0';
        }
    }

update May 8,2018

新思路

和之前的想法其实类似,都是先算出之前的数字个数,然后算该第n个数字所出现在的那个数,然后找到第n个数。

  • Java

    class Solution {
      public int findNthDigit(int n) {
          if (n <= 9) return n;
          int step = 0;
          int count = 0;
          int prevCount = 0;
          while (count < n) {
              prevCount = count;
              count += (Math.pow(10, step + 1) - Math.pow(10, step)) * (step + 1);
              step++;
          }
    
          // 例如 1-9 有9个,10-99 有90*2个,100-999有900*3个...
    
          int numPos = (n - prevCount + 1) / step;   
    
          int num = (int)Math.pow(10, step - 1) + numPos - 1;
    
          System.out.println(num);
    
          int pos = (n - 1 - prevCount) % step;
          return String.valueOf(num).charAt(pos) - '0';
      }
    }