ACWING57. 数字序列中某一位的数字(剑指offer)

数字以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);
        }
    }
};

发布了844 篇原创文章 · 获赞 28 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/tomjobs/article/details/104960183