剑指 Offer 43. 1~n 整数中 1 出现的次数

news2024/9/21 10:42:58

题目

输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。

例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。
在这里插入图片描述

思路

要求出小于等于 n 的非负整数中数字 1 出现的个数。

可以假设某个四位数n = abcd,通过统计每一位上 1 出现的次数,个数上 1 出现的次数,十位上 1 出现的次数,百位 ,千位…

也就是说小于等于 n 的所有数字中,个位上出现 1 的次数 + 十位出现 1 的次数 + …,最后得到的就是总的出现次数。

比如数字13,个位上的1一共出现过2次(111),十位上的1一共出现过4次(10,11,1213),那么数字1一共出现的次数为2 + 4 = 6

通过遍历 n 的每一位得到总个数
在这里插入图片描述

要得到十位上1出现的次数,则当前指针指向十位,称为当前位,num表示当前位的位因子,当前位为个位时 num = 1,十位时为 10,百位时为 100…同时当前位左边的定义为高位,当前位右边的定义位低位

比如n = 1004 ,此时指针指向十位(当前位)num = 10,高位为百位,千位,低位为个位

而且某一位的取值范围为 0 ~ 9,那么可以将这 10 个数分为 3 类,小于 1 (当前位数字为 0 ),等于 1(当前位数字为 1 ) ,大于 1(当前位上数字为 2 ~ 9

这里举几个栗子:

(1)n = 1004,想要计算出小于等于 1004 的非负整数中,十位上出现 1 的次数,即当前位为十位,数字为0时,小于等于 1004 的非负整数中十位上出现 1 的次数

首先进行一个判断,因为要求十位上出现1的次数,先将十位上固定为1,去调整其他位的数字(类似于滑轮密码锁,固定一位去滑动另外的数字),即十位固定为1后,小于等于1004的数字范围为10 ~ 919 (因为最小就是10,最大就是919注意千位不可能取到1 因为十位固定为1了,如果千位为1 ,则四位数为1X1X,必定大于1004
在这里插入图片描述
(2)n = 1014,在小于等于 1014 的非负整数中,十位上为 1 的最小数字为 10,最大数字为 1014,所以需要在 10 ~ 1014 这个范围内固定住十位上的 1 ,移动其他位。

然后可以将 1014 看成是 1004 + 10 = 1014,则可以将 10 ~ 1014 拆分为两部分 0010 ~ 0919 (小于 1004的范围 ),1010 ~ 1014,相当于就是在1004的基础上多了一个低位的取值范围,即high * num + low + 1

(3)n = 1024,也就是当前位为十位,数字为 2 ~ 9 时,十位上出现 1 的次数。其中最小的为 0010,最大的为 1019,也可以将其拆成两段 0010 ~ 0919(小于1004的那部分),1010 ~ 101910051024中十位为1的那部分),此时低位取值为0~9,为num的个数(当前位为num = 10),即high * num + num

java代码如下:

class Solution{
	public int countDigitOne(int n){
		int num = 1, res = 0;//num表示位因子,因为从个位开始,所以num从1开始
		int high = n / 10, cur = n % 10, low = 0;//因为从个位开始,所以高位high为n/10,当前位cur为n%10,低位low为0
		while(high != 0 || cur != 0){//只要四位数n所有位数没有走完,则循环下去
			//对三类数字进行分类讨论
			if(cur == 0)//当前位数字为 0
				res += high * num;//对应于1004
			else if(cur == 1) //当前位数字为 1 
				res += high * num + low + 1;//多加上个位的取值,对应1014
			else  //当前位上数字为 2 ~ 9
				res += (high + 1) * num;//对应1024
			low += cur * num;
			cur = high % 10;
			high /= 10;
			num *= 10;
		}
		return res;
	}
}

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

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

相关文章

Prometheus系列(五)grafana web 配置邮件告警

目录 1. contact points(创建告警渠道) 2. Notification policies(创建告警通道匹配规则) 3. Alert rules(配置告警策略) 告警配置 告警页面名词解释: 1. contact points(创建告…

玩转数据结构之Java实现线段树

前言 线段树是一种二叉搜索树,线段树的每个结点都存储了一个区间,也可以理解成一个线段,在这些线段上进行搜索操作得到你想要的答案。 线段树的适用范围很广,可以在线维护修改以及查询区间上的最值,求和。更可以扩充到…

一文浅谈sql中的 in与not in,exists与not exists的区别以及性能分析

文章目录1. 文章引言2. 查询对比2.1 in和exists2.2 not in 和not exists2.3 in 与 的区别3. 性能分析3.1 in和exists3.2 NOT IN 与NOT EXISTS4. 重要总结1. 文章引言 我们在工作的过程中,经常使用in,not in,exists,not exists来…

Unity2018.4.x~2021.3.x版 Android资源处理

注意:本文都是针对使用Gradle编译从Unity2018.4.x到Unity2020.3.x都是可以直接将Android的适配资源直接放到${PROJECT_PATH}/Assets/Plugins/Android/对应的目录下的,如:在此目录下可以方安卓平台对应的assets、res目录及子目录资源&#xff…

前端的CSS样式表知识提要

文章目录前言基本概念屏幕尺寸屏幕分辨率屏幕像素密度/像素密度/屏幕密度视口和浏览器窗口长度单位:px、em/rem和vhCSS属性的继承与覆盖CSS选择器CSS 布局基础盒子模型绝对定位和相对定位display属性浮动正常布局流(normal flow)Flexbox 布局…

【Python表白代码】 2.14“Valentine‘s Day”“没别的意思 就是借着特殊日子说声喜欢你”你在哪儿?我去见你~(各种玫瑰源码合集)

导语 Valentines Day Every man is a poet when he is in love 所有文章完整的素材源码都在👇👇 粉丝白嫖源码福利,请移步至CSDN社区或文末公众hao即可免费。 哈喽!我是你们的木木子吖~ 情人节又到了,礼物备好了没&am…

k8s部署Prometheus+Grafana

1.prometheus简介 Prometheus是一个开源的系统监控和警报工具包,最初由SoundCloud开发的,社区活跃,2016年加入了云原生计算基金会成为继Kubernetes之后的第二个托管项目;普罗米修斯以时间序列数据的形式收集并存储度量值&#xff…

python爬虫--xpath模块简介

一、前言 前两篇博客讲解了爬虫解析网页数据的两种常用方法,re正则表达解析和beautifulsoup标签解析,所以今天的博客将围绕另外一种数据解析方法,它就是xpath模块解析,话不多说,进入内容: 一、简介 XPat…

2023年谷歌蜘蛛池最全指南

本文主要是2023年关于谷歌蜘蛛池的一系列疑问,我们逐一提供解答。 本文由光算创作,有可能会被修改和剽窃,我们佛系对待这种行为吧。 首先最常见的新手问题是“什么叫谷歌蜘蛛池?” 答案是:谷歌蜘蛛池是一个深度研究谷…

微服务网关(九)负载均衡底层详细

微服务网关(九)负载均衡 四大负载均衡策略 随机负载 随机挑选目标服务器IP 轮询负载 ABC三台服务器,以ABCABC的顺序依次轮询 加权轮询 给目标服务器设置访问权重值,按照权重轮询负载 一致性哈希轮询 固定的一个客户端IP请求访…

图文解答之最短路径||

最短路径|| 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。 现在考虑网格中有障碍物。那么从左上角到…

rust过程宏 proc-macro-workshop解题-0-介绍

名字版本号rust1.69.0OSubuntu22.04proc-macro-workshop是一个学习rust过程宏非常好的工程。里边包含五大类题目。并且每种题目都有实际价值,可以应用在企业级项目中。我们在这里先介绍一下这个项目如何运行如何测试,如何验证过程宏的正确性以及如何调试。 本文只围绕以下几个…

2月编程语言排行榜出炉,第一名势头强劲

近日,TIOBE公布了2023年2月编程语言排行榜,本月各个语言表现如何?谁又摘得桂冠? TIOBE 2月Top15编程语言: 详细榜单查看TIOBE官网 https://www.tiobe.com/tiobe-index/ 关注IT行业的小伙伴们都知道,编程…

Linux入门篇(一)

Linux前言Linux初探Linux内核GNU实用工具shellLinux发行版bash shell 基础Linux文件系统Linux文件操作命令前言 在阅读诸如docker之类的书的时候,经常碰到Linux的知识。同时,大部分的盲区也是在Linux方面。因此就想稍微了解一下这个广为人使用的操作系统…

docker-入门到精通

docker知识总结 参考文档 https://jiajially.gitbooks.io/dockerguide/content/chapter_fastlearn/docker_run/–volumes-from.html 1、什么是docker ​ 容器技术、虚拟化技术已经成为一种被大家广泛认可的服务器资源共享方式,容器技术可以在按需构建操作系统实例…

vue3 Proxy响应式原理分析(面试题)

在开始正文前,先理一下vue2 Object.defineProperty 和 vue 3 Proxy 区别: Object.defineProperty:数据劫持 Proxy:数据代理 注意: 响应式原理和双向数据绑定原理是两回事,一般面试官会先问响应式原理再问双…

内网渗透(二十三)之Windows协议认证和密码抓取-Mimikatz介绍和各种模块使用方法

系列文章第一章节之基础知识篇 内网渗透(一)之基础知识-内网渗透介绍和概述 内网渗透(二)之基础知识-工作组介绍 内网渗透(三)之基础知识-域环境的介绍和优点 内网渗透(四)之基础知识-搭建域环境 内网渗透(五)之基础知识-Active Directory活动目录介绍和使用 内网渗透(六)之基…

ShardingSphere-Proxy 数据库协议交互解读

数据库协议对于大部分开发者来说算是比较冷门的知识,一般的用户、开发者都是通过现成的数据库客户端、驱动使用数据库,不会直接操作数据库协议。不过,对数据库协议的特点与流程有一些基本的了解,有助于开发者在排查数据库功能、性…

Fabric磁盘扩容后数据迁移

线上环境原来的磁盘比较小,随着业务数据的增多,磁盘需要扩容,因此需要把原来docker数据转移至新的数据盘。 数据迁移 操作系统: centOS 7   docker默认的数据目录为/var/lib/docker   创建一个新的目录/opt/dockerdata&…

Halcon转OpenCV实例--OCR字符识别(附源码)

导 读 本文主要介绍Halcon转OpenCV实例--OCR字符识别(附源码)。 实例来源 实例来源于51Halcon论坛的帖子,原贴地址: https://www.51halcon.com/forum.php?mod=viewthread&tid=889 Halcon实现 测试图: 实现代码与效果: read_image (Image, ET.png)decompose3…