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; }
- codility上的问题(13) MU 2011
- codility上的问题 (14)Nu 2011
- codility上的问题 11 Kappa 2011
- Codility上的问题 12 Lambda 2011
- Codility上的练习 (13)
- codility上的问题之四 Gamma 2011
- codility上的问题 之六 Epsilon 2011
- codility上的问题 之七 Zeta 2011
- codility 上的问题之八 Eta 2011
- codility上的问题之九 Theta 2011
- codility上的问题之十 iota 2011
- codility上的问题(15) Xi 2012
- Codility上的问题 (16) Omicron 2012
- Codility上的问题 (17) PI 2012
- codility上的问题(18) Rho 2012
- codility上的问题 (19)Sigma 2012
- codility上的问题 (22)Phi 2012
- codility上的问题 (23)Chi 2012
- 关于mysql导入导出数据库的方法
- rqn 51 乒乓球(字符串处理)
- DBCA报错, ORA-15045 ORA-17502 ORA-15081
- 【C++沉思录】编译器使用的优化技巧
- 用PersonalRank实现基于图的推荐算法
- codility上的问题(13) MU 2011
- S3C2410 实验三——块拷贝、字拷贝(寄存器的理解)
- linux根文件系统/etc/mdev.conf文件详解
- 解决Mindjet MindManager 2012 打开模板出错的方法
- fork产生进程关系
- opencv学习心得四----读取视频文件
- 中缀表达式转化为前缀和后缀表达式
- Java I/O
- Installing sharekit2