题目描述:
数字以0123456789101112131415…的格式序列化到一个字符序列中。
在这个序列中,第5位(从0开始计数)是5,第13位是1,第19位是4,等等。
请写一个函数求任意位对应的数字。
样例
输入:13
输出:1
解法一:
算法之后再补充
class Solution {
public:
int digitAtIndex(int n) {
if(n < 0)
{
return -1;
}
int digits = 1;
while(true)
{
int numbers = countOfIntegers(digits); // 求 digits 位数字一共有多少个,比如 2位数字有 10~99,共90个。
int count = numbers * digits;
if(count < 0)
{
count = INT_MAX; //本题目有个测试案例是Integer的MAX_VALUE,会导致溢出,所以我加了个判断,如果溢出,就让他等于最大值。
}
if(n < count)
{
return digitAtIndex(n, digits); // 求出要找的那位数字位于某digits位数中。
}
n -= count;
digits ++;
}
return -1;
}
int countOfIntegers(int digits)
{
if(digits == 1)
{
return 10;
}
else
{
return 9 * pow(10, digits-1);
}
}
int digitAtIndex( int n, int digits)
{
int number = beginNumber(digits) + n / digits; // 求出第n位数字在某个 digits位的数字中。
int indexFromRight =digits - n % digits; // 这里 n % digits 的结果,就是数字 number 从左起的某位数字,也就是所求的答案。
// 但是求一个数的某一位单独的数字时,是从右往左求的,所以这里使用 digits - n % digits,比如说,对于一个四位数来说,
// 从左起的第2位数字就是从右起的第3位数字
for(int i=1; i<indexFromRight; i++)
{
number /= 10;
}
return number % 10;
}
int beginNumber(int digits) //求digits位数字的第一个数字,比如对于3位数字来说,第一个3位数字就是1000.
{
if(digits == 1)
return 0;
return pow(10, digits-1);
}
};