题目:
数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从0开始计数)是5,第13位是1,第19位是4,等等。请写一个函数,求任意第n位对应的数字。
题解:
以第15位数字2为例(2隶属与12,两位数,位于12从左侧以0号开始下标为1的位置)
步骤1:首先确定该数字是属于几位数的;
如果是一位数,n < 9;
如果是两位数,n < 9 + 90 * 2 = 189;说明是两位数。
步骤2:确定该数字属于哪个数。10 + (15 - 10) / 2 = 12。
步骤3:确定是该数中哪一位。15 - 10 - (12 - 10) * 2 = 1, 所以位于“12”的下标为1的位置,即数字2。
以第1001位数字7为例
步骤1:首先确定该数字是属于几位数的;
如果是一位数,n < 9;
如果是两位数,n < 9 + 90 * 2 = 189;
如果是三位数,n < 189 + 900 * 3 = 2889;
说明是三位数。
步骤2:确定该数字属于哪个数。100 + (1001 - 190) / 3 = 370。
步骤3:确定是该数中哪一位。1001 - 190 - (370 - 100) * 3 = 1, 所以位于“370”的下标为1的位置,即数字7。
1 class DigitsInSequence { 2 int digitAtIndex(int index) { 3 if (index < 0) 4 return -1; 5 if (index < 10) 6 return index; 7 int curIndex = 10, length = 2; 8 int boundNum = 10; 9 while (curIndex + lengthSum(length) < index) { 10 curIndex += lengthSum(length); 11 boundNum *= 10; 12 length++; 13 } 14 int addNum = (index - curIndex) / length; 15 int curNum = boundNum + addNum; 16 return to_string(curNum)[index - curIndex - addNum * length] - '0'; 17 } 18 int lengthSum(int length) { 19 int count = 9; 20 for (int i = 1; i < length; i++) 21 count *= 10; 22 return count * length; 23 } 24 };