题目:数字以0123456789101112131415···的格式序列化到一个字符序列中。在这个序列中,第5位(从0开始计数)是5,第13位是1,第19位是4,等等。请写一个函数,求任意第n位对应的数字。
参考答案
public int digitAtIndex(int index) {
if (index < 0) {
return -1;
}
int digits = 1;
while (true) {
int numbers = countOfIntegers(digits);
if (index < numbers * digits) {
return digitAtIndex(index, digits);
}
index -= digits * numbers;
digits++;
}
}
private int countOfIntegers(int digits) {
if (digits == 1) {
return 10;
}
int count = 9;
while (digits > 1) {
count *= 10;
digits--;
}
return count;
}
private int digitAtIndex(int index, int digits) {
int number = 0;
if (digits > 1) {
number = 1;
for (int i = 1; i < digits; i++) {
number *= 10;
}
}
number += index / digits;
int indexFromRight = digits - index % digits;
for (int i = 1; i < indexFromRight; i++) {
number /= 10;
}
return number % 10;
}
复杂度分析
时间复杂度:O(logn)。
空间复杂度:O(1)。