学习下如何统计【0-9】在任意给定数中出现的次数
来源:互联网 发布:数据交换技术要求 编辑:程序博客网 时间:2024/06/05 15:23
总结一下以上的算法,可以看到,当计算右数第
- 取第
i 位左边(高位)的数字,乘以10i−1 ,得到基础值a 。 - 取第
i 位数字,计算修正值:- 如果大于 X,则结果为
a+10i−1 。 - 如果小于 X,则结果为
a 。 - 如果等 X,则取第
i 位右边(低位)数字,设为b ,最后结果为a+b+1 。
- 如果大于 X,则结果为
相应的代码非常简单,效率也非常高,时间复杂度只有
public static int count1(int givenNumber, int searchKey){
//cnt计数器,初始k为大于0的数
int cnt = 0, k=1;
//i是factor,用来得到每个位置上的数字
for (int i = 1;k>0;i *= 10) {
//通过k知道每一位上的基本出险次数
k = givenNumber / i;
cnt += (k / 10) * i;
//当前位上的数字
int cur = k % 10;
if (cur > searchKey) {
cnt += i;
} else if (cur == searchKey) {
//第i位的低位加上1
cnt += givenNumber - k * i + 1;
}
}
return cnt;
}
当 X = 0 时,规律与上面给出的规律不同,需要另行考虑。
最主要的区别是,最高位中永远是不会包含 0 的,因此,从个位累加到左起第二位就要结束,需要将上面代码中 for 循环的判断条件改为 k / 10 != 0。
其次是,第
int cnt = 0, k=1;
for (int i = 1;k>0;i *= 10) {
// 高位的数字。
k = n / i;
int high = k / 10;
if (x == 0) {
if (high!=0) {
high--;
} else {
break;
}
}
cnt += high * i;
// 当前位的数字。
int cur = k % 10;
if (cur > x) {
cnt += i;
} else if (cur == x) {
// n - k * i 为低位的数字。
cnt += n - k * i + 1;
}
}
return cnt;
}
- 学习下如何统计【0-9】在任意给定数中出现的次数
- 给定一个数,统计1出现的次数
- 如何统计一列数中每个元素出现的次数
- 在排序数组中找给定数字出现的次数和任意整数有几种分解方法
- OpenCL-- 统计给定单词在文本中出现次数
- 在给定范围内统计2出现的次数
- 统计一文件中出现给定字符串的次数
- 给定一个非负整数n,统计1~n中所有数中1出现的次数
- 问题5:如何在顺序数组中找到给定数字出现的次数
- 如何在排序数组中,找出给定数字出现的次数
- 如何在排序数组中,找出给定数字出现的次数
- 如何在排序数组中,找出给定数字出现的次数
- 编程统计PI前100位中0-9每个数出现的次数
- hdu 1806 Frequent values(给定一个非降序数组,求任意区间内出现次数最多的数的次数)
- 在排序数组中,找出给定数字的出现次数
- 在排序数组中,找出给定数字的出现次数
- 在排序数组中,找出给定数字的出现次数
- 在排序数组中,找出给定数字的出现次数
- css 菜单, 但不兼容IE8
- Linux内核编译与安装
- 【黑马程序员】C语言学习笔记之结构体(十二)
- 成长的过程是一点一滴的
- ORACLE结构化总结
- 学习下如何统计【0-9】在任意给定数中出现的次数
- C++第4周(春)项目1 三角形类1
- 项目review规则
- C++编写DLL的方法
- 【Redis】redis3.0源码目录
- 2013级C++第4周(春)项目——再和对象找感觉【项目3 - 程序的多文件组织】
- ORA-12519错误的解决方案 .
- Python基础学习四
- leetCode解题报告之Binary Tree Postorder Traversal