这道题一开始没看明白是什么意思,后来看明白了之后,做出来了,但是花的时间比较长,原因在于,有几个本应当设置为long类型的变量,设置成了int。
但是答案的代码,非常简洁。
我的代码
public int findNthDigit(int n) {
//0-9 9 10
//10-99 2*90 190
//100-999 3*900 2890
//1000-9999 4*9000 38890
//10000-99999 5*90000 488890
//100000-999999 6*900000 5888890
//1000000-9999999 7*9000000 68888890
long pre_num = 10;
int digit = 2;
long fi_num = 90;
int result = -1;
int oringin_n = n;
if(n>=10){
n-=9;
pre_num = digit*fi_num;
}else{
result = n;
}
//n==999999991
//pre_num==180;
while(result == -1){
if(n>pre_num){
n -= pre_num;
digit++;
fi_num *= 10;
pre_num = digit*fi_num;
//n==999999811
//digit = 3
//fi_num = 900
//pre_num== 2700
//n 999997111
//4
//9000
//36000
//999961111
//5
//90000
//450000
//999511111
//6
//900000
//5400000
//994111111
//7
//9000000
//63000000
//931111111
//8
//90000000
//720000000
//211111111
//9
//900000000
//8100000000
}else{
int start_num = 1;
for(int count = 1;count<digit;count++){
start_num *=10;
}
int target_num = start_num + (n-1)/digit;
int target_digit = (n-1)%digit;
for(int count = 0;count<=target_digit;count++){
result = target_num/start_num;
int reduce_num = result* start_num;
target_num-=reduce_num;
start_num/=10;
}
}
}
return result;
}
class Solution {
public int findNthDigit(int n) {
int digit = 1;
long start = 1;
long count = 9;
while (n > count) { // 1.
n -= count;
digit += 1;
start *= 10;
count = digit * start * 9;
}
long num = start + (n - 1) / digit; // 2.
return Long.toString(num).charAt((n - 1) % digit) - '0'; // 3.
}
}
作者:jyd
链接:https://leetcode-cn.com/problems/shu-zi-xu-lie-zhong-mou-yi-wei-de-shu-zi-lcof/solution/mian-shi-ti-44-shu-zi-xu-lie-zhong-mou-yi-wei-de-6/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
首先是,我的while和前面是一个逻辑,可以合并,然后,start直接在循环里计算,没有另列出来,最后的Long.toString(num).charAt() - '0';是一个取位很巧妙的方法。要记住