数字以0123456789101112131415…的格式序列化到一个字符序列中。
在这个序列中,第5位(从0开始计数)是5,第13位是1,第19位是4,等等。
请写一个函数求任意位对应的数字。
样例
输入:13
输出:1
思路:
先确定这个数字是什么,再确定这个数字是第几位。
class Solution {
public:
typedef long long ll;
ll get(ll x,ll y) {
ll tot = 0,cnt[10];
memset(cnt,0,sizeof(cnt));
while(x) {
cnt[++tot] = x % 10;
x /= 10;
}
return cnt[tot + 1 - y];
}
int digitAtIndex(int n) {
ll num[] = {0,9,90,900,9000,90000,900000,9000000,90000000,900000000};
ll i;
ll now = 0;
for(i = 1;i <= 10;i++) {
if(n > i * num[i]) n -= i * num[i];
else break;
now += num[i];
}
if(n % i == 0) {
now += n / i;
ll x = now,y = i;
return get(x,y);
}
else {
now += n / i + 1;
ll x = now,y = n % i;
return get(x,y);
}
}
};