算法—2,记一个自己的算法题 计算数字k在0到n中的出现的次数,k可能是0~9的一个值
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的一个值相关推荐
- python 计算数字 k 在 0 到 n 中的出现的次数,k 可能是 0~9 的一个值
3. 统计数字 中文English 计算数字 k 在 0 到 n 中的出现的次数,k 可能是 0~9 的一个值. Example 样例 1: 输入: k = 1, n = 1 输出: 1 解释: 在 ...
- 计算数字 k 在 0 到 n 中的出现的次数,k 可能是 0~9 的一个值。
思想:按位分析,从个位开始一位位分析,最后计算每个位中K出现次数的和 对个位进行分析: 例1:n=723, k=1 即((n%10)>k) 个位:个位出现1的情况为001,011,021-711 ...
- 程序员面试题精选100题:求从1到n的正数中1出现的次数
// 程序员面试题精选100题(25):求从1到n的正数中1出现的次数 // 如 f(253) = (2!=0) * 100 + 2 * f(99) + (5!=0) * 10 + 5 * f(9) ...
- 算法训练第十一天|力扣20. 有效的括号,1047. 删除字符串中的所有相邻重复项,150. 逆波兰表达式求值
20. 有效的括号 题目链接:有效的括号 参考:https://programmercarl.com/0020.%E6%9C%89%E6%95%88%E7%9A%84%E6%8B%AC%E5%8F%B ...
- 算法 64式 18、数组算法整理
1 算法思想 2 数组系列 类别-编号 题目 来源 1 二维数组中的查找 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序. 请完成一个函数,输入这样的一个二维 ...
- 《算法笔记》4.4小节——算法初步->贪心
贪心 贪心算法适用的问题一定满足最优子结构问题 采用当前状态下局部最优(较优)达到全局状态下的最优(较优),实际使用的时候往往不考虑复杂的证明,勇敢尝试贪心算法. 简单贪心 PAT B1020月饼 题 ...
- OPT和LRU页面置换算法C语言代码,页面置换算法模拟——OPT、FIFO和LRU算法.doc
实用标准文案 精彩文档 操作系统实验报告 页面置换算法模拟 --OFT.FIFO和LRU算法 班级:2013级软件工程1班 学号:X X X 姓名:萧氏一郎 数据结构说明: Memery[10]物理块 ...
- 记一个有趣的算法题:求n的阶乘最后一位非零数字
今天领导录题的时候问了一个题,使我陷入了迷茫.原题目是这样的:给出n,求n的阶乘的结果的最后一位非零数字,和末尾0的个位数.例如 n = 12 n=12 n=12, 则 n ! = 1 × 2 × . ...
- 用一个单链表L实现一个栈(算法导论第十章10.2-2题)
用一个单链表L实现一个栈(算法导论第十章10.2-2题) template<typename T> class HalfNode {public:T key;HalfNode* next; ...
最新文章
- 黄仁勋回应放弃收购Arm:公司战略并没有太大改变
- iOS 中strong,weak,copy,assign区别
- 计算机实训课教案模板,CorelDRAW实训课教案(7周)
- MySQL性能调优与架构设计——第5章 备份与恢复
- 设置二进制或者16/32位的某一位的值
- opencv java库_【OpenCV】java资源
- linux 进程崩溃log,Linux系统日志及日志分析
- 打印机修复工具_Windows10更新后打印机崩溃?速度安装修复补丁
- Maven3.5安装配置
- 工程数学(线性代数)笔记
- 版本控制工具 Git 和SVN 的区别
- 悟空CRM系统学习心得
- android相机固定焦距,android - Android相机焦距和焦距不变 - 堆栈内存溢出
- word 空格变删除 问题及解决
- 推荐10个堪称神器的学习网站,IT学习网站
- linux用c进程并行,Linux下的C / C ++使用多线程
- python 英语词典_使用Python的英语词典应用程序
- 身份证ocr的API接口,让身份证信息录入更快捷
- OpenCV学习笔记
- 本周大新闻|华为发布BB观影眼镜,Geenee AR试穿加入AI生成玩法
热门文章
- 学业水平考试网登录_江西2020年下半年普通高中学业水平考试成绩查询时间及入口...
- mysql创建库和表确保utf8_mysql创建utf8数据库
- Spring-data-redis集成提交数据出现'maxActive'和‘maxWaitMillis’错误
- 工程制图 (机件常用的基本表示法)
- 论NLP领域的内卷:我配不配找工作?
- Face++ 论文解读:一种新的行人重识别度量学习方法 | PaperDaily #20
- Java第三章 类和对象3.1+3.2
- HDU1001 Easy h-index
- 录屏、直播中的鼠标键盘演示神器PointFocus
- qnetworkreply 获取状态_《DNF》魔界人二觉宠物怎么获取 魔界人二觉宠物获取方法分享...