给你一个整数 n
,请你在无限的整数序列 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...]
中找出并返回第 n
位上的数字。
示例 1:
输入:n = 3 输出:3
示例 2:
输入:n = 11 输出:0 解释:第 11 位数字在序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ... 里是 0 ,它是 10 的一部分。
提示:
1 <= n <= 231 - 1
Related Topics
- 数学
- 二分查找
著书三年倦写字,如今翻书不识志,若知倦书悔前程 ,无如渔樵未识时
给你一个整数 n
,请你在无限的整数序列 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...]
中找出并返回第 n
位上的数字。
示例 1:
输入:n = 3 输出:3
示例 2:
输入:n = 11 输出:0 解释:第 11 位数字在序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ... 里是 0 ,它是 10 的一部分。
提示:
1 <= n <= 231 - 1
同剑指Offer 44 题 数字序列中某一位的数字
按图分析
按照这个规律分析,我们只需从头开始,依次从头开始
10
个字符90 * 2
个字符900 * 3
个字符9000 * 4
个字符1 x 10^pow
开始,1 x 10^pow
,就能得到当前是在哪个数字问题
cur + 9 * powOf10 * ( pow+1 )
会超过int
型上限,所以最简单的处理办法中间的运算过程用了long
型数据
class Solution {
public int findNthDigit(int n) {
if (n < 10){
return n;
}
long cur = 10;
long powOf10 = 10;
long pow = 1;
while (cur + 9 * powOf10 * ( pow+1 )< n){
cur += 9 * powOf10 * (pow+1);
powOf10 *= 10;
pow++;
}
long order = powOf10 + (n-cur) / (pow+1);
long idx = (n - cur) % (pow+1);
String orderStr = Long.toString(order);
return orderStr.charAt((int)idx)-'0';
}
}
发表评论