题目:输入一个整数 n ,求从 1 到 n 这 n 个整数的十进制表示中 1 出现的次数。例如输入 12 ,从 1 到 12 这些整数中包含 1 的数字有 1 , 10 , 11 和 12 ,1 一共出现了5 次。

分析:

我们曾遇到过求给定数num的二进制表示中1出现的次数,但此题是求十进制数中1出现的次数。简单的来想,可以用除法、取余来求的一个数中1的个数,然后再从1到n循环即可解决。但当n比较大时,速度会比较慢。我们现在来尝试从另一种思路来寻求一种更高效的方法。

我们可以换一种思路,分别求每位出现1的次数,然后再将每位出现1的次数相加即是所求。 不妨假设要求的数是abcde(a>0),一般地,我们求第3位,也就是百位数字出现1的次数,可分为如下三种情况:

(1),当c=0 时,则该位出现1的数分析如下:

00100--00199

01100--01199

02100--02199

……

0b100--0b199

上面一共是b*100,对于a,我们进行类似的分析,从0b200到0(b+1)099的数字中,百位数字是不会出现1的:

0(b+1)100--0(b+1)199

0(b+2)100--0(b+2)199

……

0(b+9)100--0(b+9)199

0(b+10)100--0(b+10)199即1b199

从0b200到1b199,共有10*(b*100)个百位数字为1的数字。那么类似的可以知道,从1b200到2b199同样有10*b*100个百位数字为1的数字。依次类推,从2b200到3b199,……,(a-2)b200到(a-1)b199,由于c=0,因此百位出现1的最大的数字应该为a(b-1)199;那么一共有多少个这样的数据段呢?应该比较容易看出来,一共有a个。由此可以看出当c=0时,低位数字是不影响本位数字为1的数字的个数的。

由以上分析可知,百位数字为1的数字共有a*10*100+b*100=ab*100个;

(2),当c=1时,则该位出现1的数分析如下:

在(1)情况分析的基础上,因为c=1,所以从a(b-1)200到ab1de中,仍有百位数字为1的数字存在,且比较容易知道一共有de+1个:即从ab100一直到ab1de,由此可以发现,此时低位数字影响了本位数字为1的数字的个数。

所以,此种情况,百位数字为1的数字共有:ab*100+de+1

(3),当c>1时,则该位出现1的数分析如下:

仍然在(1)分析的基础上,因为c>1,所以从a(b-1)200到ab199(因为c>1,所以abcde>ab199,而ab200到abcde中百位数字是不会出现1的)中,仍有1*100个百位数字为1的数字,在此情况下,我们同样可以发现,此时低位数字又不影响本位数字为1的数字的个数了。

所以,此种情况,百位数字为1的数字共有:ab*100+1*100=(ab+1)*100.

分析到这里,我想就应该比较容易写出程序了吧^_^

转载于:https://blog.51cto.com/10622551/1694395

在从1到n的正数中1出现的次数相关推荐

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

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

  2. python从1到n出现了多少个1-【算法21】从1到n的正数中1的出现次数

    [题 目]输入一个整数n,求从1到n这n个正数中,1出现的次数.例如:输入12,出现一的数字有1,10,11,12共有5个1,则输出5. [思 路1]几乎所有的算法题目都有很直观容易想到的方法,当然这 ...

  3. 【算法21】从1到n的正数中1的出现次数

    [题   目]输入一个整数n,求从1到n这n个正数中,1出现的次数.例如:输入12,出现一的数字有1,10,11,12共有5个1,则输出5. [思 路1]几乎所有的算法题目都有很直观容易想到的方法,当 ...

  4. 程序员面试题精选100题(25)-在从1到n的正数中1出现的次数[算法]

    题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数. 例如输入12,从1到12这些整数中包含1 的数字有1,10,11和12,1一共出现了5次. 分析:这是一道广为流传的google ...

  5. 求一个字符串中连续出现的次数最多的子串

    求一个字符串中连续出现的次数最多的子串.例如字符串"abababc",最多连续出现的为ab,连续出现三次.要和求一个字符串中的最长重复子串区分开来,还是上面的字符串,那么最长的重复 ...

  6. shell最大出现和连续出现次数_从 1 到 n 整数中 1 出现的次数

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

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

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

  8. 【刷算法】整数中1出现的次数(从1到n整数中1出现的次数)

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

  9. java 循环list 对象_java计算list集合中重复对象的次数及for循环内外创建对象

    我的需求:计算字符串集合中"数值"出现的次数,然后在for循环中计算"数值"及出现的次数 解决方案: 1.使用collections类中的frequency(集 ...

最新文章

  1. html5画布画点,在HTML5画布上绘制一个点
  2. extern相关问题
  3. 二叉树的先序建树后序输出
  4. Linux连接状态为syn_recv,linux 服务器 syn*** 大量SYN_RECV状态处理
  5. RabbitMQ——work queue
  6. IOS多选单选相册图片
  7. MSSQL从2000升级到2005丢失数据库关系图的解决方案
  8. 最简单求100以内质数算法
  9. MYSQL基础教程书籍
  10. 利用Matlab筛选给定条件的数据
  11. 【简记】Failed to download metadata for repo ‘appstream‘: Cannot prepare internal mirrorlist: No URLs in
  12. 数据挖掘-朴素贝叶斯算法
  13. linux网卡slave状态,生产环境中linux bonding 主备模式slave网卡切换的方法
  14. 2020煤矿安全监测监控模拟考试题库及煤矿安全监测监控作业考试题库
  15. 细细私语,看喜欢的书
  16. 个体工商户注册后,都需做哪些事呢?这3点很重要
  17. 微信在后台疯狂读取用户隐私?专家:乌龙!是苹果系统升级的锅...你怎么看?...
  18. 《阿里云代码安全白皮书》5个维度应对3类代码安全问题
  19. ZC706开发板SI5324配置
  20. linux-运维探针监控工具

热门文章

  1. python中列表数据汇总和平均值_python的列表List求均值和中位数实例
  2. c++17新特性_每个开发者都应该了解的一些C++特性
  3. 优朋普乐大数据_优朋普乐黑维炜:互动电视市场已进入成熟发展期
  4. python 论坛模板_python模板 - PH的个人空间 - OSCHINA - 中文开源技术交流社区
  5. win7查看隐藏文件_隐藏在电脑里の秘密,放在你眼前,你也发现不了,就是这么奥给力...
  6. c 结构体 不允许使用不完整的类型_.NET Core 基础类型介绍
  7. 赋能‘元宇宙’,这些企业强势破圈 | 2021AI 最佳成长榜
  8. 北京黑马计算机培训宿舍图案,黑马经典图形!
  9. android 按键会触发ontouch吗?_这次,我把Android事件分发机制翻了个遍
  10. 2019年末逆向复习系列之今日头条WEB端_signature、as、cp参数逆向分析