3 计算数字k在0到n中的出现的次数,k可能是0~9的一个值

例如n=12,k=1,在 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],我们发现1出现了5次 (1, 10, 11, 12)

AC

int countDigitOne(int n, int k) {if (n<10 &&k==0) {return 1;}int sum =0;int level = 1;while(n / level != 0){if (k == 0 && n / (level * 10) == 0) {// 最高位不能为0break;}int cur = (n/level) %10;//计算当前位int bef = n/(10*level);//计算当前位高位int aft = n - n/level *level;//计算当前位的低位if (cur >k) {sum += (bef+1)*level;}else if (cur <k) {sum += (bef)*level;}else{sum += (bef)*level +aft+1;}level*= 10;}return sum;
}

这道算法题其实算不上难,但是我的思路却一直限制了我,走了一些弯路,实在不应该。

首先看这道算法题,计算出现的次数,我们可以看一个例子来理解这道题。

如123中出现的2的次数。

首先123中出现了多少次2,我们可以这么想,个位有多少个2,十位有多少个2,百位有多少2。

1,个位有多少2呢?因为3是大于2的,所以2 12 22 32 42…122一共有12 +1 个,我们可以想象,如果个位的3小于2,那么就只有12个了,最后一个12X上不会有。如果等于呢 则也是12+1。

2,十位有多少2呢? 因为2 ==2 ,所以 21 22 23 24 25…29 120 121 122,这里可以看出来加入十位大于2的时候,则会有 20个,如果小于2,则10个,如果等于,则是10 + 个位+1 (因为个位是2,而计数从0开始 ,如这里加的这个1是120这个)

这里我们可以进行总结:

如果 当前位大于k,则 (高位+1)乘 当前的计数级别(个位为1,十位为10,百位为百)

如果当前位小于k, 则 为高位 乘 当前的计数级别。

如果等于,则为 高位数 乘 当前计数级别 + 低位数+1。

这里的难点就只剩下怎么计算这个当前位,怎么计算当前位的高位,怎么计算当前位的低位。

例如123 ,如果要计算十位的高位,低位,当前位。

当前位:123/10(计数级别) %10(固定10) = 12%10 = 2

高位: 123/(10(固定10) * 10(计数级别))

低位: 123 - 123/10(计数级别)*10(计数级别)

整理一下就是

        int cur = (n/level) %10;//计算当前位int bef = n/(10*level);//计算当前位高位int aft = n - n/level *level;//计算当前位的低位

算法—2,记一个自己的算法题 计算数字k在0到n中的出现的次数,k可能是0~9的一个值相关推荐

  1. python 计算数字 k 在 0 到 n 中的出现的次数,k 可能是 0~9 的一个值

    3. 统计数字 中文English 计算数字 k 在 0 到 n 中的出现的次数,k 可能是 0~9 的一个值. Example 样例 1: 输入: k = 1, n = 1 输出: 1 解释: 在 ...

  2. 计算数字 k 在 0 到 n 中的出现的次数,k 可能是 0~9 的一个值。

    思想:按位分析,从个位开始一位位分析,最后计算每个位中K出现次数的和 对个位进行分析: 例1:n=723, k=1 即((n%10)>k) 个位:个位出现1的情况为001,011,021-711 ...

  3. 程序员面试题精选100题:求从1到n的正数中1出现的次数

    // 程序员面试题精选100题(25):求从1到n的正数中1出现的次数 // 如 f(253) = (2!=0) * 100 + 2 * f(99) + (5!=0) * 10 + 5 * f(9) ...

  4. 算法训练第十一天|力扣20. 有效的括号,1047. 删除字符串中的所有相邻重复项,150. 逆波兰表达式求值

    20. 有效的括号 题目链接:有效的括号 参考:https://programmercarl.com/0020.%E6%9C%89%E6%95%88%E7%9A%84%E6%8B%AC%E5%8F%B ...

  5. 算法 64式 18、数组算法整理

    1 算法思想 2 数组系列 类别-编号 题目 来源 1 二维数组中的查找 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序. 请完成一个函数,输入这样的一个二维 ...

  6. 《算法笔记》4.4小节——算法初步->贪心

    贪心 贪心算法适用的问题一定满足最优子结构问题 采用当前状态下局部最优(较优)达到全局状态下的最优(较优),实际使用的时候往往不考虑复杂的证明,勇敢尝试贪心算法. 简单贪心 PAT B1020月饼 题 ...

  7. OPT和LRU页面置换算法C语言代码,页面置换算法模拟——OPT、FIFO和LRU算法.doc

    实用标准文案 精彩文档 操作系统实验报告 页面置换算法模拟 --OFT.FIFO和LRU算法 班级:2013级软件工程1班 学号:X X X 姓名:萧氏一郎 数据结构说明: Memery[10]物理块 ...

  8. 记一个有趣的算法题:求n的阶乘最后一位非零数字

    今天领导录题的时候问了一个题,使我陷入了迷茫.原题目是这样的:给出n,求n的阶乘的结果的最后一位非零数字,和末尾0的个位数.例如 n = 12 n=12 n=12, 则 n ! = 1 × 2 × . ...

  9. 用一个单链表L实现一个栈(算法导论第十章10.2-2题)

    用一个单链表L实现一个栈(算法导论第十章10.2-2题) template<typename T> class HalfNode {public:T key;HalfNode* next; ...

最新文章

  1. 黄仁勋回应放弃收购Arm:公司战略并没有太大改变
  2. iOS 中strong,weak,copy,assign区别
  3. 计算机实训课教案模板,CorelDRAW实训课教案(7周)
  4. MySQL性能调优与架构设计——第5章 备份与恢复
  5. 设置二进制或者16/32位的某一位的值
  6. opencv java库_【OpenCV】java资源
  7. linux 进程崩溃log,Linux系统日志及日志分析
  8. 打印机修复工具_Windows10更新后打印机崩溃?速度安装修复补丁
  9. Maven3.5安装配置
  10. 工程数学(线性代数)笔记
  11. 版本控制工具 Git 和SVN 的区别
  12. 悟空CRM系统学习心得
  13. android相机固定焦距,android - Android相机焦距和焦距不变 - 堆栈内存溢出
  14. word 空格变删除 问题及解决
  15. 推荐10个堪称神器的学习网站,IT学习网站
  16. linux用c进程并行,Linux下的C / C ++使用多线程
  17. python 英语词典_使用Python的英语词典应用程序
  18. 身份证ocr的API接口,让身份证信息录入更快捷
  19. OpenCV学习笔记
  20. 本周大新闻|华为发布BB观影眼镜,Geenee AR试穿加入AI生成玩法

热门文章

  1. 学业水平考试网登录_江西2020年下半年普通高中学业水平考试成绩查询时间及入口...
  2. mysql创建库和表确保utf8_mysql创建utf8数据库
  3. Spring-data-redis集成提交数据出现'maxActive'和‘maxWaitMillis’错误
  4. 工程制图 (机件常用的基本表示法)
  5. 论NLP领域的内卷:我配不配找工作?
  6. Face++ 论文解读:一种新的行人重识别度量学习方法 | PaperDaily #20
  7. Java第三章 类和对象3.1+3.2
  8. HDU1001 Easy h-index
  9. 录屏、直播中的鼠标键盘演示神器PointFocus
  10. qnetworkreply 获取状态_《DNF》魔界人二觉宠物怎么获取 魔界人二觉宠物获取方法分享...