一个更好的办法是利用数学公式直接计算出最终的结果,该方法是依次求出数字 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出现的次数相关推荐

  1. 剑指offer——整数中1出现的次数(从1到n整数中1出现的次数)

    题目描述 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了. ...

  2. 剑指offer 矩阵中的路径 @python

    剑指offer 矩阵中的路径 @python 题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向 ...

  3. 8. 返回数组里出现次数最多的数字_剑指offer 数组中出现次数超过一半的数字

    题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...

  4. 数据结构-剑指offer-整数中1出现的次数

    题目:求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了.AC ...

  5. 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} ...

  6. python加减法计算题 代码_关于《剑指offer》中不用加减乘除做加法的Python代码的问题...

    题目如下: 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 题目不难,可以采用位操作来实现,利用异或运算来计算不带进位的加法结果,利用与运算计算进位的标志,然后将这两个 ...

  7. 剑指Offer——链表中倒数第K个节点

    1.题目描述 输入一个链表,输出该链表中倒数第k个结点. 2.代码实现 package com.baozi.offer;/*** @author BaoZi* @create 2019-07-11-1 ...

  8. [剑指Offer]-矩阵中的路径

    题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩阵中 ...

  9. 剑指offer——数据流中的中位数

    题目: 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值.我们使 ...

  10. 剑指offer:矩阵中的路径

    题目 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩阵中的某 ...

最新文章

  1. 多gpu训练梯度如何计算,求和是否要求平均
  2. 浅析 Linux 初始化 init 系统:sysvinit
  3. 用EC5/EC6自定义class的区别及用法 -- Phaser3网页游戏框架
  4. 软件技术支持职责和能力要求(偏软件方向)
  5. python path模块_python pathlib模块详解
  6. dj鲜生-38-项目上线简介-从本地小项目到云服务的调试
  7. mac qt编译出现问题的解决方法
  8. dump分析工具_阿里P8教你如何使用Jprofile解析dump文件
  9. Controller接口控制器(6)
  10. 添加七牛云存储_3月1日七牛云存储割韭菜的应对方法
  11. 我眼中未来的人机交互
  12. iview中table里嵌套i-switch、input、select等
  13. graphql java中文文档_GraphQL学习指南 PDF 下载
  14. QQ空间自动发广告说说?可能是激活工具附带的独狼Rootkit!
  15. 美赛流程以及经验分享
  16. Flink No operators defined in streaming topology. Cannot execute.
  17. 动态和静态查看一个进程的内存使用
  18. 电容笔和触控笔有什么区别?第三方电容笔了解下
  19. oracle+dbcc+checkdb,dbcc checkdb 修复数据库
  20. 利用计算机设计轴对称图案,“轴对称图形”信息技术应用设计与分析|轴对称图形有哪些图片...

热门文章

  1. 后缀数组求最长重复子串
  2. python脚本批量生成数据
  3. 【行为型模式】《大话设计模式》——读后感 (15)烤羊肉串引来的思考?——命令模式...
  4. 解决Flex/Flash跨域访问出现的安全沙箱问题
  5. HarmonyOS之调试分析打印HiLog日志
  6. 145. Binary Tree Postorder Traversal 二叉树的后序遍历
  7. Django 模型字段 —— ImageField
  8. 《python从入门到精通》——使用位移运算符对密码进行加密
  9. 《C champion》 为什么要学习C语言
  10. 【C/C++13】天气APP:数据挖掘/HTTP协议/非结构化数据存储(filetoblob.cpp),数据管理/监控告警(hsmtable.cpp,tbspaceinfo.cpp)