劍指offer44 數字序列中某一位的數字
阿新 • • 發佈:2020-07-20
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); }