学习下如何统计【0-9】在任意给定数中出现的次数
总结一下以上的算法,可以看到,当计算右数第 i 位包含的 X 的个数时:
- 取第 i 位左边(高位)的数字,乘以 10i−1,得到基础值 a。
- 取第 i 位数字,计算修正值:
- 如果大于 X,则结果为 a+10i−1。
- 如果小于 X,则结果为 a。
- 如果等 X,则取第 i 位右边(低位)数字,设为 b,最后结果为 a+b+1。
相应的代码非常简单,效率也非常高,时间复杂度只有 O(log10n)。
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。
其次是,第 i 位的基础值不是高位数字乘以 10i−1,而是乘以 10i−1−1。以 1 至 102 为例,千位中实际包含 3 个 0,但这三个 0 是来自于个位 2 计算得到的修正值,而非来自于基础值。千位的基础值是 0,因为不存在数字 01, 02, 03, ..., 09,即数字前是没有前导 0 的。解决办法就是将上面代码中第 6 行改为 cnt += (k / 10 - 1) * i。
public static int count(int n, int x) {
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】在任意给定数中出现的次数相关推荐
- Java实现统计某字符串在另一个字符串中出现的次数
面试时会经常考这样的题目,估计也不让使用正则表达式.还好这个算法还算简单,不过在草稿纸上写难免会出现运行异常,好吧,面试官赢了,乃们屌丝就实实在在的把代码码出来吧. 谢谢"心扉"对 ...
- 本题要求编写程序,统计并输出某给定字符在给定字符串中出现的次数。
7-2 统计字符出现次数 输入样例: 输入第一行给出一个以回车结束的字符串(少于80个字符):第二行输入一个字符. 输出样例: 在一行中输出给定字符在给定字符串中出现的次数. 输入样例: progra ...
- R语言关联规则挖掘数据集预览、分析、筛选:项目数的分布形态(分位数、密度图)、itemFrequency函数统计每一项目在所有事务中出现的次数、最常发生的项目、数据筛选(交易的集合项目大于1)
R语言关联规则挖掘数据集预览.分析.筛选:项目数的分布形态(分位数.密度图).itemFrequency函数统计每一项目在所有事务中出现的次数.最常发生的项目.数据筛选(交易的集合项目大于1) 目录
- 统计并输出某给定字符在给定字符串中出现的次数_查找常用字符
给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表.例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 3 ...
- JDBC连接Mysql并统计指定关键词在某一列中出现的次数
1:先看一下效果 这个是原始内容数据: 这个是统计后的数据显示,初始都为0 这个是执行过程中的状态: 2.贴出代码 import java.util.regex.Pattern; import jav ...
- Java中实现统计一个字符串在另一个字符串中出现的次数统计
public int getSubNum(String a,String b){int num=0;String str=a;int index=a.indexOf(b);while(index!=- ...
- Python三种方法统计4位自然数变为黑洞数6174所需次数分布
推荐图书: <Python程序设计(第3版)>,(ISBN:978-7-302-55083-9),董付国,清华大学出版社,2020年6月第1次印刷,2021年9月第10次印刷,山东省一流本 ...
- 统计一个字符在另一个字符串中出现的次数
文章目录 1.一个字符在另一个字符串中出现的次数 2.测试 3.输出 1.一个字符在另一个字符串中出现的次数 /*** showTime 懂得都懂 <br>* @param findStr ...
- XP下安装IIS6.0的办法
XP下安装IIS6.0的办法 首先在运行中输入"c:/windows/inf/sysoc.inf",系统会自动使用记事本打开sysoc.inf这个文件. 在sysoc.inf中找到 ...
最新文章
- 一文看懂CV中的注意力机制
- 随机访问类(RandomAccessFile)
- linux iptables导致httpd网页打不开
- Leetcode 169.多数元素 (每日一题 20210715)
- 固定资产增值和减值操作
- linux下python安装opencv库_Linux下怎么配置python和opencv
- 禅道项目管理工具环境搭建
- 数据类型、变量和数组
- linux扫描仪安装程序,给扫描仪在Linux系统里安个家
- java国际软件工程师_JAVA国际软件工程师--学生选课系统
- PySide2嵌入外部程序
- 辞退了一位简历造假的程序员,简历美化可以,造假不可取!
- 【cvpr2022】ReSTR: Convolution-free Referring Image Segmentation Using Transformers
- python 3.7 安装 spyder‑kernels 模块
- oracle索引的事
- 集列的上限集和下限集
- 交换机千兆和百兆对网速影响_交换机对网速的影响
- 爬虫加tkinter做的中英互译小软件
- 【LLYD】That 70s show: why the disco decade is back in fashion
- RecyclerView嵌套实现购物车