分析:
--------------------------------------------------拆成的索引数 ----------------不拆的话
- 一位数字(0-9)------------------------1 * 10个 ------------- ----------10个
- 两位数字(10-99 ) --------------2 * 9 * 10个 -------------------------90个
- 三位数字(100-999)-------------3 * 9 * 100个 ----------------------900个
- .base位数字…------------------base * 9 * 10^(base - 1)--------9 * 10 ^(base - 1)
解题思路:
- 判断该索引所对应的数字是几位数 -------> base
- 判断该索引所对应得数字是几 -------->realNum
- 判断该索引是原来数字的第几位 ----------> IndexOfRealNum
代码:
1.无效检验,以及如果索引小于10,说明是一位数字直接返回
if (index < 0) {
return -1;
}
if (index < 10) {
return index;
}
2.判断该索引所对应的数字是几位数
index -= 10;
int base = 2;
while (index >= skipWidth(base)) {
index -= skipWidth(base);
base++;
}
private static int skipWidth(int base) {
return 9 * base * (int)Math.pow(10, base - 1);
}
3.判断该索引所对应得数字是几
int realNum = getRealNum(index, base);
private static int getRealNum(int index, int base) {
int baseNum = (int)Math.pow(10, base - 1); // 底数,二位底数是100,三位1000,,,
if (index == 0) {
return baseNum;
}
return baseNum + (index / base);
}
- 判断该索引是原来数字的第几位
int indexOfRealNum = getIndexOfRealNum(index, base);
private static int getIndexOfRealNum(int index, int base) {
return index % base;
}
5.返回结果
return String.valueOf(realNum).charAt(indexOfNum) - '0';
完整代码:
static int getIndexOfRealNum(int index) {
if (index < 0) {
return -1;
}
if (index < 10) {
return index;
}
index -= 10;
int base = 2;
while (index >= skipWidth(base)) {
index -= skipWidth(base);
base++;
}
int realNum = getRealNum(index, base);
int indexOfNum = getIndexOfRealNum(index, base);
return String.valueOf(realNum).charAt(indexOfNum) - '0';
}
private static int getIndexOfRealNum(int index, int base) {
return index % base;
}
private static int getRealNum(int index, int base) {
int baseNum = (int)Math.pow(10, base - 1);
if (index == 0) {
return baseNum;
}
return baseNum + (index / base);
}
private static int skipWidth(int base) {
return 9 * base * (int)Math.pow(10, base - 1);
}