1. 题目
在无限的整数序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, …中找到第 n 个数字。
注意:
n 是正数且在32为整形范围内 ( n < 2^31)。
示例 1:
输入:
3
输出:
3示例 2:
输入:
11
输出:
0
说明:
第11个数字在序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 1--0--, 11, ... 里是0,它是10的一部分。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/nth-digit
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
《剑指Offer》同题:面试题44. 数字序列中某一位的数字
2. 解题
- 1位数9个,数字长度9
- 2位数90个,数字长度2*90
- 3位数900个,长度3*900
class Solution {
public:int findNthDigit(int n) {if(n < 10)return n;long len = 9;int i = 2, k = 10, num=9;while(len+i*9*pow(10,i-1) < n){len += i*9*pow(10,i-1);num += 9*pow(10,i-1);i++;}if((n-len)%i)num += (n-len)/i + 1;elsenum += (n-len)/i;string s(to_string(num));return s[((n-len)%i + i -1)%i]-'0';}
};
class Solution { //2020.2.24
public:int findNthDigit(int n) {if(n < 10)return n;int count = 9, i = 2, num = 9;while(count+9*pow(10,i-1)*i <= n){count += 9*pow(10,i-1)*i;num += 9*pow(10,i-1);i++;}n -= count;//剩余的位数if(n%i != 0)//不等于0,下一个数的,第几位return fd(num+n/i+1,n%i);return fd(num+n/i,i);//否则,当前数的,最后一位}int fd(int num, int n){int i = int(1e9);int bit;while(num/i == 0)i /= 10;while(n--){bit = num/i;num -= bit*i;i /= 10;}return bit;}
};