前言

众所周知,《剑指offer》是一本“好书”。

如果你是个算法菜鸡(和我一样),那么最推荐的是先把剑指offer的题目搞明白。

对于剑指offer题解这个系列,我的写作思路是,对于看过文章的读者,能够做到:

  • 迅速了解该题常见解答思路(偏门思路不包括在内,节省大家时间,实在有研究需求的人可以查阅其它资料)
  • 思路尽量贴近原书(例如书中提到的面试官经常会要求不改变原数组,或者有空间限制等,尽量体现在代码中,保证读者可以不漏掉书中细节)
  • 尽量精简话语,避免冗长解释
  • 给出代码可运行,注释齐全,关注细节问题
  • 代码能够通过牛客网在线编程《剑指offer》测试

《剑指offer题解》系列

你可以通过以下两种途径查看《剑指offer题解》系列:

  • 关注我的公众号:Rude3Knife,点击公众号下方:剑指offer题解
  • 剑指offer题解专栏(CSDN)

题目介绍

求出1 ~ 13的整数中1出现的次数,并算出100 ~ 1300的整数中1出现的次数?为此他特别数了一下1 ~ 13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。

解题思路

方法一:递归每个数字

思路

思路很简单,写个for循环,从1到n,在循环体中判断这个数包含了多少个1

复杂度O(nlogn),面试官不怎么开心呢。。

方法二:找规律

思路

思路解释参考:

https://www.nowcoder.com/profile/3371548/codeBookDetail?submissionId=16319486

设N = abcde,其中abcde分别为十进制中各位上的数字。
如果要计算百位上1出现的次数,它要受到3方面的影响:百位上的数字,百位以下(低位)的数字,百位以上(高位)的数字。①如果百位上数字为0,百位上可能出现1的次数由更高位决定。比如:12013,则可以知道百位出现1的情况可能是:100 ~ 199,1100 ~ 1199,2100 ~ 2199,,…,11100 ~ 11199,一共1200个。可以看出是由更高位数字(12)决定,并且等于更高位数字(12)乘以 当前位数(100)。② 如果百位上数字为1,百位上可能出现1的次数不仅受更高位影响还受低位影响。比如:12113,则可以知道百位受高位影响出现的情况是:100 ~ 199,1100 ~ 1199,2100 ~ 2199,,….,11100 ~ 11199,一共1200个。和上面情况一样,并且等于更高位数字(12)乘以当前位数(100)。但同时它还受低位影响,百位出现1的情况是:12100~12113,一共114个,等于低位数字(113)+1。③ 如果百位上数字大于1(2 ~ 9),则百位上出现1的情况仅由更高位决定,比如12213,则百位出现1的情况是:100 ~ 199,1100 ~ 1199,2100 ~ 2199,…,11100 ~ 11199,12100 ~ 12199,一共有1300个,并且等于更高位数字+1(12+1)乘以当前位数(100)。

代码

public int NumberOf1Between1AndN_Solution(int n) {//1的个数int count = 0;//当前位int i = 1;int current, after, before;while((n/i)!= 0){//高位数字current = (n/i)%10;//当前位数字before = n/(i*10);//低位数字after = n-(n/i)*i;//如果为0,出现1的次数由高位决定,数量等于高位数字 * 当前位数if (current == 0) {count += before * i;} else if(current == 1) {//如果为1,出现1的次数由高位和低位决定,高位*当前位+低位+1count += before * i + after + 1;} else{//如果大于1,出现1的次数由高位决定,(高位数字+1)* 当前位数count += (before + 1) * i;}//前移一位i = i*10;}return count;
}

总结

此题思考再三,想分析作者为什么要出此题,该题出现在优化时间和空间效率大类中,作者主要是想让同学们运用逻辑推理,想到时间上更优化的解法。

《剑指offer题解》系列

你可以通过以下两种途径查看《剑指offer题解》系列:

  • 关注我的公众号:Rude3Knife,点击公众号下方:剑指offer题解专栏
  • 剑指offer题解专栏(CSDN)

关注我

我是一名后端开发。主要关注后端开发,数据安全,爬虫等方向。微信:yangzd1102

Github:@qqxx6661

个人博客:

  • CSDN:@qqxx6661
  • 知乎:@Zhendong
  • 简书:@蛮三刀把刀
  • 掘金:@蛮三刀把刀

原创博客主要内容

  • Java知识点复习全手册
  • Leetcode算法题解析
  • 剑指offer算法题解析
  • SpringCloud菜鸟入门实战系列
  • SpringBoot菜鸟入门实战系列
  • Python爬虫相关技术文章
  • 后端开发相关技术文章

个人公众号:Rude3Knife

如果文章对你有帮助,不妨收藏起来并转发给您的朋友们~

java计算整数出现的次数_[剑指offer题解][Java]1到n整数中1出现的次数相关推荐

  1. java 最大子数组_[剑指offer题解][Java]连续子数组的最大和

    前言 众所周知,<剑指offer>是一本"好书". 如果你是个算法菜鸡(和我一样),那么最推荐的是先把剑指offer的题目搞明白. 对于剑指offer题解这个系列,我的 ...

  2. java统计一个字符串中每个字符出现的次数_剑指offer算法题054:字符流中第一个不重复的字符...

    推荐阅读:宇宙条的工作总结:一年前还在面试找工作,一年后在面试找工作的学弟学妹们:第一次当面试官的经历分享小编在求职找找工作期间剑指offer上的算法题刷了很多遍,并且每道题小编当时都总结了一种最适合 ...

  3. 统计数组中每个数字出现的次数_剑指Offer(二十八) 数组中次数出现超过一半的数字...

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

  4. java queue 最大值_[剑指offer题解]队列的最大值/滑动窗口的最大值

    前言 众所周知,<剑指offer>是一本"好书". 为什么这么说? 因为在技术面试中,它里面罗列的算法题在面试中出现的频率是非常非常高的. 有多高,以我目前不多的面试来 ...

  5. 在要求输入数字处找到非数字字符_剑指 Offer 67. 把字符串转换成整数 leetcode 剑指offer系列...

    点击专辑上方"蓝字"关注我吧 题目难度: 中等 原题链接[1] 今天继续更新剑指 offer 系列, 老样子晚上 6 点 45 分准时更新公众号 每日精选算法题, 大家记得关注哦~ ...

  6. 两个数组中对应的下标的值合成一个新的数组_剑指 offer 面试题精选图解 03 . 数组中重复的数字

    今天分享的题目来源于 LeetCode 上的剑指 Offer 系列 面试题03. 数组中重复的数字. 题目链接:https://leetcode-cn.com/problems/shu-zu-zhon ...

  7. opencv计算两数组的乘积_#剑指Offer#12. 构建乘积数组

    题目描述:给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1]. 其中B中的元素B[i]=A[0] * A[1]... * A[i-1] * A[i+1]... * A ...

  8. java剪绳子_14. 剪绳子(剑指 Offer 题解Java版)

    本文转载自[微信公众号:五角钱的程序员,ID:xianglin965]经微信公众号授权转载,如需转载与原文作者联系 文章目录 14. 剪绳子1. 题目链接2.题目描述3.解题思路3.1贪心3.2动态规 ...

  9. 在数组中查找指定元素_剑指 offer 第一题: 二维数组中的查找

    题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数 ...

最新文章

  1. RSA加密算法原理和java简单实现
  2. SpringBoot之SSL配置(SpringBoot实战)
  3. 为CentOS 6 配置本地YUM源
  4. C#三层架构第四课之DAL层
  5. Gentle.Net学习笔记四:修改代码,使用Oracle数据库
  6. [LOJ 6042]「雅礼集训 2017 Day7」跳蚤王国的宰相(树的重心+贪心)
  7. php框架使用教程,php框架laravel excel包使用教程介绍
  8. 【BZOJ1096】仓库建设,斜率优化DP练习
  9. windows补丁下载地址
  10. java uploadify 下载_java uploadify 实现文件上传
  11. 密码忘用计算机解开,电脑密码忘了怎么办,详细教您电脑开机密码忘记了怎么解决...
  12. AI人工智能知识图谱Neo4j关联查询人物关系cypher查询
  13. texstudio语法检查
  14. 【Day4.7】错过湄南河夜游,去河畔夜市晚餐
  15. Layui 数据表格合并单元格
  16. APS的定义是什么?高级计划与排程APS有哪些痛点?
  17. 产品设计指南:如何从零设计一款手机端产品(APP)?
  18. IEEE论文公式快捷获取
  19. CF 1680 E. Moving Chips dp 2000
  20. excel怎么一个格子斜分_『在Excel中,把一个格子用线分成三个怎么弄啊』一个单元格怎么斜分两个...

热门文章

  1. 在Tomcat上设置和使用Apache Solr
  2. JavaFX游戏(四连环)
  3. OSGI和Spring动态模块–简单的Hello World
  4. ssm中怎么用location.href跳到controller层_聊聊自动驾驶中的功能开发
  5. linux 进程的vss rss uss,内核/内存管理中的VSS/RSS/PSS/USS
  6. 整型数组 判断 java,给定一个整数数组,判断其中是否有3个数和为N
  7. python 图表美化_你的图表不美观怎么办,Python实现数据可视化帮你实现
  8. python提取html正文为txt,python 提取html文本的方法
  9. 邮箱批量登录接验证码_记一次莫名的需求(临时邮箱|企业邮箱)
  10. php 对象 final,PHP7_OOP_对象重载以及魔术方法_对象遍历_final关键字