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

9612fb30798f2c8e253cbdbf427b8279.png

前言

众所周知,《剑指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

f7a95d9caa0583b3a4a3beaa5e76ca6d.png

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/346765.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql数据库+ssh框架_SSH框架+Mysql数据库开发java web会员积分消费管理系统

项目描述会员消费管理:会员信息调取查询、会员消费商品添加金额计算、兑换商品等会员管理:会员增删改查积分管理:积分设置、商品积分设置等积分兑换、数据库备份还原、折扣管理、商品管理等运行环境jdk7(8)tomcat7(8)mysql5.7myeclipes或ecli…

spring和spring_Spring交易可见性

spring和spring在初始化应用程序上下文时,Spring在遇到带有Transactional标记的类时会创建代理。 Transactional可以应用于类级别或方法级别。 在类级别应用它意味着该类中定义的所有公共方法都是事务性的。 Spring创建的代理类型,即Jdk代理或CGLIB代理&…

python上传文件到linux服务器_python上传大文件到服务器报错

项目需要,在mac上将打包好的文件(四五百兆)自动上传到web后台,用了两种方式上传,都报了类似的错误,在windows和linux上测试不会报错,但是到了mac打包机上就会报错:①第一种报错:Traceback (most…

mysql 更改root密码及 主机_设置更改root密码(远程,本地)、连接mysql、mysql常用命令...

设置更改root密码1、将mysql加入环境变量中[rootcentos7 ~]# grep mysql /etc/profileexport PATH/usr/local/mysql/bin/:$PATH2、直接登录,无密码[rootcentos7 ~]# mysql -uroot3、方式一:设置密码[rootcentos7 ~]# mysqladmin -uroot password 123456W…

从NetBeans运行和调试WildFly Swarm应用程序

使用NetBeans的Java EE开发人员习惯于直接在NetBeans所选择的应用程序服务器中运行和调试其瘦战应用程序。 在开发打包为ber或镂空jars的微服务时,您期望使用相同的轻松方式进行运行和调试。 好消息是您可以。 在本文中,我将逐步演示如何在NetBeans中运行…

mysql 事实表 维度表_数据库的事实表与维度表

维度表示你要对数据进行分析时所用的一个量,比如你要分析产品销售情况,你可以选择按类别来进行分析,或按区域来分析,这样的按照什么分析就构成一个维度。前面的实例就可以有两个维度:类型和区域。另外每个维度还可以有…

hazelcast入门教程_Hazelcast入门

hazelcast入门教程7月,我写了一个博客向Java开发人员介绍erlang,重点介绍了这两种语言之间的一些异同。 erlang虚拟机具有许多令人印象深刻的内置功能,其中之一是它们独立于位置且可以相互通信。 这意味着可以通过编写很少的代码行在VM之间同…

tcp java实例_实现了基于TCP的Java Socket编程实例代码

实现了基于TCP的Java Socket编程,功能很简单:客户端向服务器端输出一名话"connect",服务器端接收输出到控制台并向客户端输出一名话"Hello",客户端接收并输出。1.服务器端package javase.net.socket;import java.io.Data…

java 批量上传图片插件_java多文件上传plupload控件实现多图片上传(一)

使用的是plupload-2.1.2 控件。网上资源挺多的,很好下载。plupload 官方地址 : http://www.plupload.com/plupload 示例: http://www.plupload.com/examples/plupload Github: https://github.com/moxiecode/plupload整体框架用的是easyui springMVC。1、前台jsp页…

java servlet_Java Servlet的前100个问题

java servlet1)是“ servlets”目录还是“ servlet”目录? 回答: 对于Java Web Server: 在文件系统上,它是“ servlet” c:\ JavaWebServer1.1 \ servlets \ DateServlet.class 在URL路径中,…

精通java ee项目案例_精通JavaEE项目案例

第1章 Java EE开发入门 11.1 基本概念 11.1.1 Java EE API 11.1.2 MVC模型 21.1.3 JSP讨论 31.1.4 Servlet讨论 41.1.5 Model1和Model2 51.2 Eclipse 51.2.1 Eclipse的平台简介 61.2.2 Eclipse的体系结构 61.3 Struts 71.3.1 认识Struts 71.3.2 Strut…

java调用php session_php读取memcahed java session

情景:1:现在有两个系统,一个是Java做的系统,一个是PHP的系统,现在要把两个系统弄成一个单点登录。2:两个系统两个库,两个库的表结构完全不同,现在要解决的就是session共享问题和用户…

[MEGA DEAL]完整的Java编程训练营(94%折扣)

成为Java Master的10门课程(83.5小时):使用JavaFX的设计UI,利用设计模式,Master Multithreading等 嘿,怪胎, 本周,在我们的JCG Deals商店中 ,我们提供了另一个超值优惠…

怎么把java程序放进php_如何在php脚本中执行Java程序?

I have been struggling with this for awhile trying all sorts of options withno results – the file is never created(the file is created with an absolutepath so it’s not being created and Ijust can’t find the file). Does anyonehave any ideas?我认为问题是…

java重排序_Java内存模型FAQ(四)重排序意味着什么?

译者:Alex在很多情况下,访问一个程序变量(对象实例字段,类静态字段和数组元素)可能会使用不同的顺序执行,而不是程序语义所指定的顺序执行。编译器能够自由的以优化的名义去改变指令顺序。在特定的环境下,处理器可能会…

javafx响应式布局_JavaFX的响应式设计

javafx响应式布局使用CSS技术,为您的网站创建响应式设计相对容易。 根据屏幕的大小,您可以使用其他CSS文件和布局。 在JavaFX中,乍一看似乎有些困难,因为CSS仅负责样式,而不负责布局。 但是,为各个屏幕尺寸…

pojo java_什么是POJO,JavaBean?

什么是POJO,JavaBean?总结:POJO:一个简单的Java类,这个类没有实现/继承任何特殊的java接口或者类,不遵循任何主要java模型,约定或者框架的java对象。在理想情况下,POJO不应该有注解。…

JVM体系结构101:了解您的虚拟机

Java虚拟机(JVM)架构和Java字节码101的初学者速成班 Java应用程序无处不在,它们在我们的手机,平板电脑和计算机上。 在许多编程语言中,这意味着要多次编译代码才能使其在不同的OS上运行。 对于作为开发人员的我们来说…

flask对mysql数据库增删改查_Flask学习(三) - Flask-SQLAlchemy对数据库增删改查

Flask-SQLAlchemy对数据库增删改查安装pip install flask-sqlalchemy具体不多说了,主要是对数据库进行简单的增删改查,上代码,看注释app.route(/)def index():#增加article1 Article(titletest1, contentthe first test)db.session.add(arti…

逸出 java_【java】知识系谱-基础篇-线程-发布、逸出

java并发编程实战的解释,不够详细,尤其this引用逸出让人理解有些费解,java并发编程实战里面的内容就直接拷贝过来发布:使对象能够在当前作用域之外的代码中使用逸出:当某个不该被发布的对象被发布时,这种情…