leetcode 400. 第N个数字(Nth Digit)
题目描述:
在无限的整数序列 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的一部分。
解法:
class Solution {
public:
int getBit(int& num, int idx){
vector<int> bits;
while(num != 0){
bits.push_back(num%10);
num /= 10;
}
bits = vector<int>(bits.rbegin(), bits.rend());
return bits[idx];
}
int findNthDigit(int n) {
// 123456789 10111213141516171819
// 1*9, 2*90, 3*900, 4*9000
long long multi = 9;
long long val = 1;
long long max_val = pow(2, 60);
vector<long long> count(1, 0);
for(int i = 1; i < 32; i++){
val = multi*i;
multi *= 10;
if(val > max_val){
break;
}else{
count.push_back(val);
}
// cout<<val<<endl;
}
long long begin = 1;
for(int i = 1; i < 32; i++){
// cout<<"n = "<<n<<", val="<<count[i]<<endl;
if(n > count[i]){
n -= count[i];
begin *= 10;
}else{
n--;
int num_idx = n/i;
n %= i;
// the n bit of the num_idx number from begin;
int num = begin + num_idx;
return getBit(num, n);
}
}
return -1;
}
};