44 数字序列中某一位的数字
题目
数字以01234567891011121314...的格式排列。在这个序列中,第5位(从0开始计)是5,第13位是1,第19位是4。求任意第n为对应的数字。
C++ 题解
从位数为1开始统计不同的位数的数字所占的总位数,如09一共占10位,1099一共占180位…并进行累加,一旦累加的和超过给定的位数,可以找到目标数字的一个大概范围,再进一步进行分析。
需要一点注意int类型会溢出(比如,pow(10,11)就溢出了)需要定义为更大的类型。
class Solution {
public:
int digitAtIndex(int n) {
// i表示是几位数:1,2,3...
// s表示位数共有多少个: 1位数9个(先忽略0),2位数90个,3位数900 个
// base:表示几位数的基数,1位数是1,2位数是10,3位数是100
long long i = 1, s = 9, base = 1;
while(n > i * s)
{
n -= i * s; // 1000 - 9 - 90 * 2 - 900 * 3 ...
i ++;
s *= 10;
base *= 10;
}
// number 表示的是数字是多少,因为从0开始,所以减去一个1
// (n + i - 1) / i 向上取整
long long number = base + (n + i - 1) / i - 1;
// r 表示是该数字的第几位,除不尽就是那一位,除尽就是最后一位
long long r = n % i ? n % i : i;
// 除到所求数字的那一位
for (int j = 0; j < i - r; j ++)
number /= 10;
// 返回对10取余的结果
return number % 10;
}
};
python 题解
class Solution(object):
def digitAtIndex(self, n):
i = 1; s = 9
while n > s * i:
n -= s * i
s *= 10
i += 1
res = 10 ** (i - 1) + n / i - 1
if n % i == 0:
res = str(res)[-1]
else:
res = str(res + 1)[n % i - 1]
return res