codility上的问题(13) MU 2011

来源:互联网 发布:java nio 编辑:程序博客网 时间:2024/05/17 18:18

给定正整数N,求0..N的整数中出现多少次0。

N是以字符串形式给的,长度L [1..10^4]

结果对1410000017取模。

要求时间复杂度O(L),空间复杂度O(L)。

这个题有两个比较恶心的地方,第一个是求的不是1..N之中的0的次数,而是0..N的,第二那个模的2倍会超过int,这就使得算加法时也要小心。

算法不难:

设当前考虑的是某一位,

xxxxxoxxxx

它之前那些位不含它本身 记做pre[i],它之后的那些位记做suf[i]。

那么pre[i]表示的数 要从1变到(pre[i] - 1),第i位可以为0,suf[i]那么多位可以任意,所以这些数总个数是(pre[i] - 1) * w[i],其中w[i]是第i为后面的位数m的权重,即10^m。

然后,当前面那些位恰好是pre[i]时,考虑第i位,如果等于0,说明后面那些位只能全0变为suf[i],所以有(suf[i] + 1)个。

否则如果第i位大于0,则说明pre[i]和0这些前缀经过了后面完整的一个周期,因此加上一个w[i]。

对所有的i慢慢做就可以了,注意i从1开始,因为首位不能为0,这是0的特殊性决定的。

如果求的是其他数字的话,i要从第0位开始算。


代码:

// you can also use includes, for example:// #include <algorithm>#include <vector>const int M =  1410000017;int add(long long x,long long y) {    return ((x += y) >= M)?(x - M):x;   }int mul(long long x, long long y) {    return x * y % M;}int solution(const string &S) {    // write your code here...    int n = S.size(),answer,i;    vector<int> pre, suf, w;    pre.resize(n);    suf.resize(n);    w.resize(n);    pre[0] = 0;    for (i = 1; i < n; ++i) {        pre[i] = add(mul(pre[i - 1], 10) , S[i - 1] - '0');    }    w[n - 1] = 1;    suf[n - 1] = 0;    for (i = n - 2; i >= 0; --i) {        w[i] = mul(w[ i + 1], 10);        suf[i] = add(suf[i + 1], mul(w[i + 1], S[i + 1] - '0'));    }    for (i = answer = 1; i < n; ++i) {        answer = add(answer, mul(pre[i], w[i]));        if ((answer -= w[i]) < 0) {             answer += M;                    }        if (S[i] > '0') {            answer = add(answer,w[i]);        }        else if (S[i] == '0') {            answer = add(answer, suf[i]);            answer = add(answer, 1);        }    }    return answer;                }


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 苹果手机摔弯了怎么办 6s主板摔弯了怎么办 京东显示器坏了怎么办 苹果6s手机弯了怎么办 苹果手机变弯了怎么办 苹果手机屏幕摔碎了怎么办 苹果6p后壳弯曲怎么办 苹果手机后壳有点弯曲怎么办 苹果手机x弯了怎么办 苹果8手机弯了怎么办 苹果8p手机弯了怎么办? 美版iphone弯了怎么办 oppor9手机听筒声音小怎么办 苹果7摔弯了屏幕怎么办 苹果手机压弯了怎么办 京东买的电脑坏了怎么办 拼多多低价乱价怎么办 厂家不通过经销商直接发货怎么办 媳妇吵架说我全家有病怎么办 全家都不尊重媳妇怎么办 招商闪电贷有额度不通过怎么办 闪电贷页面登录不进去怎么办 91借钱极速逾期怎么办 论文没过拿不到毕业证怎么办 大学论文不过拿不到毕业证怎么办 转店被黑中介骗了钱怎么办? 被星外转铺骗了怎么办 店铺转了后悔了怎么办 商铺转让不出去怎么办? 和包券密码丢失怎么办 天猫购物卷兑换不了怎么办 淘宝新店每天只有几个访客怎么办 注册淘宝企业店铺需要审核怎么办 淘宝店铺被投诉知识产权怎么办 一般违规扣48分怎么办 金税盘处于报税期不能开票怎么办 小规模税率开错了怎么办 我是代购卖家被买家投诉偷税怎么办 天猫盒子内存不够怎么办 天猫品牌申请不通过怎么办 天猫商家发货发个空包裹怎么办