1. 程式人生 > 實用技巧 >劍指offer44 數字序列中某一位的數字

劍指offer44 數字序列中某一位的數字

package com.example.lettcode.offer;

/**
 * @Class FindNthDigit
 * @Description 劍指offer44 數字序列中某一位的數字
 * 數字以0123456789101112131415…的格式序列化到一個字元序列中。
 * 在這個序列中,第5位(從下標0開始計數)是5,第13位是1,第19位是4,等等。
 * 請寫一個函式,求任意第n位對應的數字。
 * 示例 1:
 * 輸入:n = 3
 * 輸出:3
 * <p>
 * 示例 2:
 * 輸入:n = 11
 * 輸出:0
 * <p>
 * 限制:
 * 0 <= n < 2^31
 * @Author
 * @Date 2020/7/20
 **/
public class FindNthDigit {   
}
/**
 * 解法:
 * 1. 確定n所在數字的位數,記為digit;
 * 2. 確定n所在的數字,記為num;
 * 3. 確定n是num中的哪一數位,並返回結果。
 */
public static int findNthDigit(int n) {

        int digit = 1;      // n所在數字的位數
        long start = 1;     // 相同位數數字的第一個數字
        long count = 9;
        // 確定n所在數字的位數,記為digit;
        while (n > count) { // 1.
            n -= count;
            digit += 1;
            start *= 10;
            count = digit * start * 9;
        }
        // 確定n所在的數字,記為num;
        long num = start + (n - 1) / digit; // 2.
        return Long.toString(num).charAt((n - 1) % digit) - '0'; // 3.
    }
// 測試用例
public static void main(String[] args) {
	int n = 3;
	int ans = findNthDigit(n);
	System.out.println("FindNthDigit demo01 result:" + ans);

	n = 11;
	ans = findNthDigit(n);
	System.out.println("FindNthDigit demo01 result:" + ans);

	n = 120;
	ans = findNthDigit(n);
	System.out.println("FindNthDigit demo01 result:" + ans);

	n = 1200;
	ans = findNthDigit(n);
	System.out.println("FindNthDigit demo01 result:" + ans);
}