剑指offer--整数中1出现的次数
一个更好的办法是利用数学公式直接计算出最终的结果,该方法是依次求出数字 X 在个位、十位、百位等等出现的次数,再相加得到最终结果。博客地址
- 从 1 至 10,在它们的个位数中,任意的 X 都出现了 1 次。
- 从 1 至 100,在它们的十位数中,任意的 X 都出现了 10 次。
- 从 1 至 1000,在它们的千位数中,任意的 X 都出现了 100 次。
依此类推,从 1 至 10^i,在它们的左数第二位(右数第 i 位)中,任意的 X 都出现了 10^(i−1) 次。
接下来以 n=2593,X=5 为例来解释如何得到数学公式。从 1 至 2593 中,数字 5 总计出现了 813 次,其中有 259 次出现在个位,260 次出现在十位,294 次出现在百位,0 次出现在千位。
现在依次分析这些数据,首先是个位。从 1 至 2590 中,包含了 259 个 10,因此任意的 X 都出现了 259 次。最后剩余的三个数 2591, 2592 和 2593,因为它们最大的个位数字 3 < X,因此不会包含任何 5。
然后是十位。从 1 至 2500 中,包含了 25 个 100,因此任意的 X 都出现了 25×10=250 次。剩下的数字是从 2501 至 2593,它们最大的十位数字 9 > X,因此会包含全部 10 个 5。最后总计 250 + 10 = 260。
接下来是百位。从 1 至 2000 中,包含了 2 个 1000,因此任意的 X 都出现了 2×100=200 次。剩下的数字是从 2001 至 2593,它们最大的百位数字 5 == X,这时情况就略微复杂,它们的百位肯定是包含 5 的,但不会包含全部 100 个。如果把百位是 5 的数字列出来,是从 2500 至 2593,数字的个数与百位和十位数字相关,是 93+1 = 94。最后总计 200 + 94 = 294。
最后是千位。现在已经没有更高位,因此直接看最大的千位数字 2 < X,所以不会包含任何 5。到此为止,已经计算出全部数字 5 的出现次数。
总结一下以上的算法,可以看到,当计算右数第 i 位包含的 X 的个数时:
- 取第 i 位左边(高位)的数字,乘以 10i−1,得到基础值 a。
- 取第 i 位数字,计算修正值:
- 如果大于 X,则结果为 a+10^(i−1)。
- 如果小于 X,则结果为 a。
- 如果等 X,则取第 i 位右边(低位)数字,设为 b,最后结果为 a+b+1。
class Solution {
public:int NumberOf1Between1AndN_Solution(int n){// 计算数字 X 在 1-n 中出现的次数。int x = 1;int cnt = 0;int i = 1;int k = n / i;while(k!=0) {// k / 10 为高位的数字。cnt += (k / 10) * i;// 当前位的数字。int cur = k % 10;if (cur > x) {cnt += i;} else if (cur == x) {// n - k * i 为低位的数字。cnt += n - k * i + 1;}i *= 10;k = n / i;}return cnt;}
};
剑指offer--整数中1出现的次数相关推荐
- 剑指offer——整数中1出现的次数(从1到n整数中1出现的次数)
题目描述 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了. ...
- 剑指offer 矩阵中的路径 @python
剑指offer 矩阵中的路径 @python 题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向 ...
- 8. 返回数组里出现次数最多的数字_剑指offer 数组中出现次数超过一半的数字
题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...
- 数据结构-剑指offer-整数中1出现的次数
题目:求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了.AC ...
- LeetCode-剑指43-1-n整数中出现1的次数
1.逐位统计 我们统计每一位k上面可能出现1的次数:1.对于每一位k上面的出现的1,我们首先统计其出现 ( n / 1 0 k ) × 1 0 k − 1 (n/10^k)\times10^{k-1} ...
- python加减法计算题 代码_关于《剑指offer》中不用加减乘除做加法的Python代码的问题...
题目如下: 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 题目不难,可以采用位操作来实现,利用异或运算来计算不带进位的加法结果,利用与运算计算进位的标志,然后将这两个 ...
- 剑指Offer——链表中倒数第K个节点
1.题目描述 输入一个链表,输出该链表中倒数第k个结点. 2.代码实现 package com.baozi.offer;/*** @author BaoZi* @create 2019-07-11-1 ...
- [剑指Offer]-矩阵中的路径
题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩阵中 ...
- 剑指offer——数据流中的中位数
题目: 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值.我们使 ...
- 剑指offer:矩阵中的路径
题目 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩阵中的某 ...
最新文章
- 多gpu训练梯度如何计算,求和是否要求平均
- 浅析 Linux 初始化 init 系统:sysvinit
- 用EC5/EC6自定义class的区别及用法 -- Phaser3网页游戏框架
- 软件技术支持职责和能力要求(偏软件方向)
- python path模块_python pathlib模块详解
- dj鲜生-38-项目上线简介-从本地小项目到云服务的调试
- mac qt编译出现问题的解决方法
- dump分析工具_阿里P8教你如何使用Jprofile解析dump文件
- Controller接口控制器(6)
- 添加七牛云存储_3月1日七牛云存储割韭菜的应对方法
- 我眼中未来的人机交互
- iview中table里嵌套i-switch、input、select等
- graphql java中文文档_GraphQL学习指南 PDF 下载
- QQ空间自动发广告说说?可能是激活工具附带的独狼Rootkit!
- 美赛流程以及经验分享
- Flink No operators defined in streaming topology. Cannot execute.
- 动态和静态查看一个进程的内存使用
- 电容笔和触控笔有什么区别?第三方电容笔了解下
- oracle+dbcc+checkdb,dbcc checkdb 修复数据库
- 利用计算机设计轴对称图案,“轴对称图形”信息技术应用设计与分析|轴对称图形有哪些图片...
热门文章
- 后缀数组求最长重复子串
- python脚本批量生成数据
- 【行为型模式】《大话设计模式》——读后感 (15)烤羊肉串引来的思考?——命令模式...
- 解决Flex/Flash跨域访问出现的安全沙箱问题
- HarmonyOS之调试分析打印HiLog日志
- 145. Binary Tree Postorder Traversal 二叉树的后序遍历
- Django 模型字段 —— ImageField
- 《python从入门到精通》——使用位移运算符对密码进行加密
- 《C champion》 为什么要学习C语言
- 【C/C++13】天气APP:数据挖掘/HTTP协议/非结构化数据存储(filetoblob.cpp),数据管理/监控告警(hsmtable.cpp,tbspaceinfo.cpp)