总结一下以上的算法,可以看到,当计算右数第 i 位包含的 X 的个数时:

  1. 取第 i 位左边(高位)的数字,乘以 10i−1,得到基础值 a。
  2. 取第 i 位数字,计算修正值:
    1. 如果大于 X,则结果为 a+10i−1。
    2. 如果小于 X,则结果为 a。
    3. 如果等 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】在任意给定数中出现的次数相关推荐

  1. Java实现统计某字符串在另一个字符串中出现的次数

    面试时会经常考这样的题目,估计也不让使用正则表达式.还好这个算法还算简单,不过在草稿纸上写难免会出现运行异常,好吧,面试官赢了,乃们屌丝就实实在在的把代码码出来吧. 谢谢"心扉"对 ...

  2. 本题要求编写程序,统计并输出某给定字符在给定字符串中出现的次数。

    7-2 统计字符出现次数 输入样例: 输入第一行给出一个以回车结束的字符串(少于80个字符):第二行输入一个字符. 输出样例: 在一行中输出给定字符在给定字符串中出现的次数. 输入样例: progra ...

  3. R语言关联规则挖掘数据集预览、分析、筛选:项目数的分布形态(分位数、密度图)、itemFrequency函数统计每一项目在所有事务中出现的次数、最常发生的项目、数据筛选(交易的集合项目大于1)

    R语言关联规则挖掘数据集预览.分析.筛选:项目数的分布形态(分位数.密度图).itemFrequency函数统计每一项目在所有事务中出现的次数.最常发生的项目.数据筛选(交易的集合项目大于1) 目录

  4. 统计并输出某给定字符在给定字符串中出现的次数_查找常用字符

    给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表.例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 3 ...

  5. JDBC连接Mysql并统计指定关键词在某一列中出现的次数

    1:先看一下效果 这个是原始内容数据: 这个是统计后的数据显示,初始都为0 这个是执行过程中的状态: 2.贴出代码 import java.util.regex.Pattern; import jav ...

  6. Java中实现统计一个字符串在另一个字符串中出现的次数统计

    public int getSubNum(String a,String b){int num=0;String str=a;int index=a.indexOf(b);while(index!=- ...

  7. Python三种方法统计4位自然数变为黑洞数6174所需次数分布

    推荐图书: <Python程序设计(第3版)>,(ISBN:978-7-302-55083-9),董付国,清华大学出版社,2020年6月第1次印刷,2021年9月第10次印刷,山东省一流本 ...

  8. 统计一个字符在另一个字符串中出现的次数

    文章目录 1.一个字符在另一个字符串中出现的次数 2.测试 3.输出 1.一个字符在另一个字符串中出现的次数 /*** showTime 懂得都懂 <br>* @param findStr ...

  9. XP下安装IIS6.0的办法

    XP下安装IIS6.0的办法 首先在运行中输入"c:/windows/inf/sysoc.inf",系统会自动使用记事本打开sysoc.inf这个文件. 在sysoc.inf中找到 ...

最新文章

  1. 一文看懂CV中的注意力机制
  2. 随机访问类(RandomAccessFile)
  3. linux iptables导致httpd网页打不开
  4. Leetcode 169.多数元素 (每日一题 20210715)
  5. 固定资产增值和减值操作
  6. linux下python安装opencv库_Linux下怎么配置python和opencv
  7. 禅道项目管理工具环境搭建
  8. 数据类型、变量和数组
  9. linux扫描仪安装程序,给扫描仪在Linux系统里安个家
  10. java国际软件工程师_JAVA国际软件工程师--学生选课系统
  11. PySide2嵌入外部程序
  12. 辞退了一位简历造假的程序员,简历美化可以,造假不可取!
  13. 【cvpr2022】ReSTR: Convolution-free Referring Image Segmentation Using Transformers
  14. python 3.7 安装 spyder‑kernels 模块
  15. oracle索引的事
  16. 集列的上限集和下限集
  17. 交换机千兆和百兆对网速影响_交换机对网速的影响
  18. 爬虫加tkinter做的中英互译小软件
  19. 【LLYD】That 70s show: why the disco decade is back in fashion
  20. RecyclerView嵌套实现购物车

热门文章

  1. 读论文之《基于 FPGA 的并行全比较排序算法》
  2. 入门架构——单机高性能
  3. RabbitMQ的应用场景以及基本原理介绍
  4. Dell Fluid FS 集群NAS系统在4K非编环境的卓越表现
  5. 屏蔽敏感词的正则表达式
  6. 使用cxf开发webservice应用时抛出异常
  7. [Drupal] How to display the month in French words.
  8. Apache2 + Tomcat6配置负载均衡
  9. 你给我人脉,我给你全世界
  10. modelsim 自动化 独立仿真vivado ip核工程