class Solution {
public:
int findNthDigit(int n) {
//确定是几位数
long long i = 1, s = 9, base = 1;
while(n > s * i){
n -= s * i;
i ++;
s *= 10;
base *= 10;
}
//确定是几位数中的第几位
int number = base + (n + i - 1) / i - 1;
//属于那个数的第几位
int r = n % i ? n % i : i;
for(int j = 0; j < i - r; j ++) number /= 10; //n 与 number别弄错了
return number % 10;
}
};
c++ 代码
class Solution {
public:
int findNthDigit(int n)
{
int i=1;
while(n>9pow(10,i-1)i)
{
n=n-9pow(10,i-1)i;
i++;
}
int min=pow(10,i-1);
int cur=min+(n-1)/i;
int cur_digit=(n-1)%i;
string s=to_string(cur);
return s[cur_digit]-‘0’;
}
};
class Solution {
public:
int findNthDigit(int n) {
//base是10的倍数,i表示这个区间的数有几位
//base i 范围 数量 字符数量
//base = 1, i = 1, [0-9], 9, 9x1 = 9
//base = 10, i = 2,[10-99], 90, 90x2 = 180
//base = 100, i = 3, [100-999], 900, 900x3 = 2700
//base = 1000, i = 4, [1000-9999], 9000, 9000x4 = 36000
//....
//先找到n在哪个区间内,再找到具体的数字,最后找到是第几位
long base = 1;
int i = 1;
long cur = 9;//表示当前区间有多少字符
//找区间
while(cur < n){
n = n - cur;
base *= 10;
i++;
cur = 9 * base * i;
}
//是哪个数字
int num = base + (n - 1)/i;//(n-1)是因为串从0开始,要去掉0
//是哪一位
int index = (n - 1)%i + 1;//位数从1开始
int temp = pow(10, i - index);
int ans = num/temp%10;//取出这一位
return ans;
}
};
class Solution {
public int findNthDigit(int n) {
if(n == 0){
return 0;
}
long bit = 1;
int i = 1;
long count = 9;
while(count < n){
n = (int) (n - count);
bit = bit * 10;
i++;
count = bit * i * 9;
}
//确定是在这个区间的哪个数
long num = bit + (n - 1) / i;
//确定在Num的那个字符
int index = (n - 1) %i + 1;
int res = (int)(num / Math.pow(10, i - index)) % 10;
return res;
//时间复杂度:O(logn)
//空间复杂度:O(1)
}
}
共以下 9 个回答
c++ 代码
class Solution {
public:
int findNthDigit(int n)
{
int i=1;
while(n>9pow(10,i-1)i)
{
n=n-9pow(10,i-1)i;
i++;
}
int min=pow(10,i-1);
int cur=min+(n-1)/i;
int cur_digit=(n-1)%i;
string s=to_string(cur);
return s[cur_digit]-‘0’;
}
};
智力题了属于
7.28
Day19:下面是代码
//-‘0’是一个字符运算,它的作用是将字符转换为对应的整数值。
//ASCII码中,数字字符 ‘0’ 的值是 48,而其他数字字符的值依次递增。通过执行字符运算 -‘0’,我们可以将字符转换为对应的整数值。