剑指 Offer 44. 数字序列中某一位的数字——数学问题(找规律)

剑指 Offer 44. 数字序列中某一位的数字

题目描述

数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。

请写一个函数,求任意第n位对应的数字。

示例 1:

输入:n = 3
输出:3
示例 2:

输入:n = 11
输出:0

解题思路

其中可以确定的是

数字范围数量位数占多少位
1-9919
10-99902180
100-99990032700
1000-99999000436000
  1. 先确定n所在的数字的位数,记为digit(例如2901 = 9 + 180 +2700 +12,则n为4位数,第12位)
  2. 确定n所在的数字,记为num(数据num = 1000 + (12 -1)/ 4 = 1000 + 2 = 1002)
  3. 确定n是num中的哪一位数,并返回结果。(如,找到数据num是1002,则定位1002中的位置 = (n - 1 ) % 4 = 3) s. charAt(3) = 2
class Solution{
	public int findNthDigit(int n){
		int digit = 1; // n 所在的数字的位数
		long start = 1; //数字范围开始的第一个数
		long count = 9; //占多少位
		while(n > count){
			n -= count; 
			digit++; 
			start *= 10;
			count= digit * start * 9;
			
		}
		long num = start + (n - 1) / digit;
		return Long.toString(num).charAt((n - 1) % digit ) - '0';
	}
}
posted @ 2021-02-27 14:26  your_棒棒糖  阅读(83)  评论(0)    收藏  举报