数字序列中某一位的数字 -- java
题目描述
数字以 0123456789101112131415…n (这是一个0~n排列)的格式序列化到一个字符序列中,在这个字符序列中,第5位(从0开始计数)是5,第13位是1,第19位是4,等等。请写出一个函数,求任意第n位对应的数字。
解题思路
以第1001位数字7为例
-
步骤1:首先确定该数字是属于几位数的;
如果是一位数,n<9;如果是两位数,n<10+90×2=190;如果是三位数,n<190+900×3=2890
说明是n三位数。(这里有个循环) -
步骤2:确定该数字属于哪个数。100+(1001-190)/3= 370
-
步骤3:确定是该数中哪一位。1001-190-(370-100)*3 = 1,所以位于“370”的下标为1的位置,即数字7
代码
public class DigitAtIndex {
/**
* 求出数字序列中某一位的数字
* @param index
* @return
*/
public static 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++;
}
}
/**
* 求出m位的数字的个数
* @param digits
* @return
*/
public static int countOfIntegers(int digits) {
if (digits == 1) {
return 10;
}
int count = (int) Math.pow(10, digits-1);
return count;
}
/**
* 当我们知道要找的哪一位数字位于某m位数之中后,使用下面的函数找出那位数字
* @param index
* @param digits
* @return
*/
public static int digitAtIndex(int index, int digits) {
int number = beginNumber(digits) + index / digits;
int indexFromRight = digits - index % digits;
for (int i = 1; i < indexFromRight; i++) {
number /= 10;
}
return number % 10;
}
/**
* 求出m位的第一个数字
* @param digits
* @return
*/
public static int beginNumber(int digits) {
if (digits == 1) {
return 0;
}
return (int) Math.pow(10,digits-1);
}
public static void main(String[] args) {
System.out.println(digitAtIndex(1001));
}
}
来自:
《剑指Offer》
Coding-Interviews/数字序列中某一位的数字.md at master · todorex/Coding-Interviews