版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sd4567855/article/details/86095535
day13, 第N个数字
题目来源:leetcode
在无限的整数序列 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, 10, 11, … 里是0,它是10的一部分。
解答:首先给第n个数字定位,看它处于哪一个区间,例如第8个数字处于[0,10)区间,第12个数字处于[10,99)区间。。依次推类。。之后以区间的左端作为起始点,开始遍历,每走一个数便加上该数拥有的位数,直到满足第n个数字为止,最后计算第n个数字再该数中的确切的位置。
代码:
class Solution {
public:
vector<int> findigit( int n){
int digit;
vector<int> record;
if( n==0){
record.push_back(0);//number
record.push_back(0);//digit
return record;
}
else if( n > 0 && n <=9){
record.push_back(1);//number_begin
record.push_back(1);//digit
return record;
}
else if( n > 9 && n <=189){
record.push_back(10);//number
record.push_back(2);//digit
return record;
}
else if( n > 189 && n <=2889){
record.push_back(190);//number
record.push_back(3);//digit
return record;
}
else if( n > 2889 && n <=38889){
record.push_back(2890);//number
record.push_back(4);//digit
return record;
}
else if( n > 38889 && n <=488889){
record.push_back(38890);//number
record.push_back(5);//digit
return record;
}
else if( n > 488889 && n <=5888889){
record.push_back(488890);//number
record.push_back(6);//digit
return record;
}
else if( n > 5888889 && n <=68888889){
record.push_back(5888890);//number
record.push_back(7);//digit
return record;
}
else if( n > 68888889 && n <=788888889){
record.push_back(68888890);//number
record.push_back(8);//digit
return record;
}
else if( n > 788888889 && n <=8888888889){
record.push_back(788888890);//number
record.push_back(9);//digit
return record;
}
return record;
}
int findNthDigit(int n) {
vector<int> record = findigit(n);
int begin;
begin = record[ record.size() - 2];
int digit = record[ record.size() - 1];
// cout<<"begin = "<<begin<<" digit = "<<digit<<endl;
int i = 1;
for(int k = 1; k < digit; k++)
i*=10;
//cout<<" i = "<<i<<endl;
int j;
for(j = begin ; j < n;){
if( j + digit > n)
break;
else
i++, j+=digit;
}
//cout<<" j = "<<j<<endl;
string str = "";
char strr[32] = {};
sprintf(strr,"%d", i);
for( int j = 0; j <strlen(strr); j++)
str += strr[j];
return str[ n - j] - '0';
}
};
运行结果:啊啊啊,感觉自己快渣渣死了。。。。☹算法肯定需要优化。。。