java计算整数出现的次数_[剑指offer题解][Java]1到n整数中1出现的次数
前言
众所周知,《剑指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出现的次数相关推荐
- java 最大子数组_[剑指offer题解][Java]连续子数组的最大和
前言 众所周知,<剑指offer>是一本"好书". 如果你是个算法菜鸡(和我一样),那么最推荐的是先把剑指offer的题目搞明白. 对于剑指offer题解这个系列,我的 ...
- java统计一个字符串中每个字符出现的次数_剑指offer算法题054:字符流中第一个不重复的字符...
推荐阅读:宇宙条的工作总结:一年前还在面试找工作,一年后在面试找工作的学弟学妹们:第一次当面试官的经历分享小编在求职找找工作期间剑指offer上的算法题刷了很多遍,并且每道题小编当时都总结了一种最适合 ...
- 统计数组中每个数字出现的次数_剑指Offer(二十八) 数组中次数出现超过一半的数字...
题目描述 思路与解析 题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长 ...
- java queue 最大值_[剑指offer题解]队列的最大值/滑动窗口的最大值
前言 众所周知,<剑指offer>是一本"好书". 为什么这么说? 因为在技术面试中,它里面罗列的算法题在面试中出现的频率是非常非常高的. 有多高,以我目前不多的面试来 ...
- 在要求输入数字处找到非数字字符_剑指 Offer 67. 把字符串转换成整数 leetcode 剑指offer系列...
点击专辑上方"蓝字"关注我吧 题目难度: 中等 原题链接[1] 今天继续更新剑指 offer 系列, 老样子晚上 6 点 45 分准时更新公众号 每日精选算法题, 大家记得关注哦~ ...
- 两个数组中对应的下标的值合成一个新的数组_剑指 offer 面试题精选图解 03 . 数组中重复的数字
今天分享的题目来源于 LeetCode 上的剑指 Offer 系列 面试题03. 数组中重复的数字. 题目链接:https://leetcode-cn.com/problems/shu-zu-zhon ...
- 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 ...
- java剪绳子_14. 剪绳子(剑指 Offer 题解Java版)
本文转载自[微信公众号:五角钱的程序员,ID:xianglin965]经微信公众号授权转载,如需转载与原文作者联系 文章目录 14. 剪绳子1. 题目链接2.题目描述3.解题思路3.1贪心3.2动态规 ...
- 在数组中查找指定元素_剑指 offer 第一题: 二维数组中的查找
题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数 ...
最新文章
- RSA加密算法原理和java简单实现
- SpringBoot之SSL配置(SpringBoot实战)
- 为CentOS 6 配置本地YUM源
- C#三层架构第四课之DAL层
- Gentle.Net学习笔记四:修改代码,使用Oracle数据库
- [LOJ 6042]「雅礼集训 2017 Day7」跳蚤王国的宰相(树的重心+贪心)
- php框架使用教程,php框架laravel excel包使用教程介绍
- 【BZOJ1096】仓库建设,斜率优化DP练习
- windows补丁下载地址
- java uploadify 下载_java uploadify 实现文件上传
- 密码忘用计算机解开,电脑密码忘了怎么办,详细教您电脑开机密码忘记了怎么解决...
- AI人工智能知识图谱Neo4j关联查询人物关系cypher查询
- texstudio语法检查
- 【Day4.7】错过湄南河夜游,去河畔夜市晚餐
- Layui 数据表格合并单元格
- APS的定义是什么?高级计划与排程APS有哪些痛点?
- 产品设计指南:如何从零设计一款手机端产品(APP)?
- IEEE论文公式快捷获取
- CF 1680 E. Moving Chips dp 2000
- excel怎么一个格子斜分_『在Excel中,把一个格子用线分成三个怎么弄啊』一个单元格怎么斜分两个...
热门文章
- 在Tomcat上设置和使用Apache Solr
- JavaFX游戏(四连环)
- OSGI和Spring动态模块–简单的Hello World
- ssm中怎么用location.href跳到controller层_聊聊自动驾驶中的功能开发
- linux 进程的vss rss uss,内核/内存管理中的VSS/RSS/PSS/USS
- 整型数组 判断 java,给定一个整数数组,判断其中是否有3个数和为N
- python 图表美化_你的图表不美观怎么办,Python实现数据可视化帮你实现
- python提取html正文为txt,python 提取html文本的方法
- 邮箱批量登录接验证码_记一次莫名的需求(临时邮箱|企业邮箱)
- php 对象 final,PHP7_OOP_对象重载以及魔术方法_对象遍历_final关键字