题目描述:
在无限的整数序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, …中找到第 n 个数字。
注意:
n 是正数且在32为整形范围内 ( n < 231)。
示例 1:
输入:
3
输出:
3
示例 2:
输入:
11
输出:
0
说明:
第11个数字在序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, … 里是0,它是10的一部分。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/nth-digit
题目解释及思路:
输入11,之所以输出的是0,是因为是按照字符来的,1234567891011,第11位是“10”的0。
根据观察:
1-9,有9个数
10-99,有902个数
100-999,有9003个数
设n是i位数,那对应的区间有9*pow(10,i-1)*i 个数。
那我们在确定这个输入的数字所处位置的字符是哪个时,我们可以先判断这个数字在哪个区间。
找到所在区间后,判断是第几个数,在判断是第几个数的第几位。
解题方法:
class Solution {
public int findNthDigit(int n) {
int i = 1;//i用来记录是几位数
while(n > Math.pow(10,i-1)*9*i){//不断让n和区间范围比,来确定n所在区间
n-=Math.pow(10,i-1)*9*i;//这里减去了前区间的范围,所以再次比较
i++; //只需要和下一个区间的范围比即可,不用加之前区间的范围
} //找到区间后,用a来记录是第几个数字
int a=(n-1)/i+(int)Math.pow(10,i-1);//之所以除以i,是因为i位数的区间,一个数占了i个位置
StringBuilder sb = new StringBuilder();
sb.append(a);//把a添加到字符串中
sb.toString();
return sb.charAt((n-1)%i)-'0';//确定出n是第几位,再减去0的ASCII码值即可
}
}