题目
数字以0123456789101112131415…的格式序列化到一个字符序列中,在这个序列中。第五位(从0开始计数)是5,第13位是1,第19位是4,等等。
请写一个函数,求任意第n位对应的数字。
思路
思路一
暴力解法,从0开始计数,数到第n位。
思路二
以1001位为例子。
因为序列前10位是0-9这10个只有1位的数字。
序列的前180(2 * 90) 位是10-99这90个有2位的数字。
序列的前2700(3 * 900) 位是100-999这 900个有3位的数字。
因为10 + 180 < 1001 < 10 + 180 + 2700
可以判断第1001位是三位数。
(1001 – 10 – 180 ) / 3 = 270 余 1
可知是第270个三位数字的第2位 即7
代码
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++;
}
}
public static int countOfIntegers(int digits){
if(digits == 1)return 10;
else return 9 * (int)Math.pow(10,digits - 1);
}
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;
}
public static int beginNumber(int digits){
return (int) Math.pow(10,digits - 1);
}
总结
本题根据题意分析需要得到位数,剩余数字,不同位数的数字个数总和等变量。