力扣算法数学类—剑指 Offer 43. 1~n 整数中 1 出现的次数

news2024/11/22 15:14:59

目录

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

题解:

代码:

结果:


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

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

示例 1:

输入:n = 12
输出:5
示例 2:

输入:n = 13
输出:6
 

限制:

1 <= n < 2^31

题解:

目标:找出小于等于 n 的非负整数中数字 1 出现的个数

第一瞬间想的肯定是:

①直接逐位遍历每个数的每一位,当遇到 1 的时候,计数 +1。但是会超时。

②将所有数字拼接起来,再逐位遍历。仍会超时。

废话不多说,现在来讲解更快更好的方法:

统计每一位上 1 出现的次数,个数上 1 出现的次数,十位上 1 出现的次数,百位 ,千位······

就是说小于等于 n 的所有数字中,个位上出现 1 的次数 + 十位出现 1 的次数 + ···结果就是总的出现次数。

想象自己脑子里有一个行李箱的滚轮密码锁,我们固定其中的某一位,然后可以随意滑动其他位

注:该比喻来自与网友 ryan0414,这个比喻真的很贴合本题解题思想

思路:

通过逐位计算每个位上可能出现1的次数,从个位开始向高位遍历。通过分析当前位和高低位的关系,根据不同的情况累计出现1的次数。最终得到所有位上1的总次数,并返回结果

  • 初始化变量:将给定的数字n分为高位(high)、当前位(cur)和低位(low),并设置一个变量num为1来记录位数,cnt为结果计数器。

  • 进入循环:通过判断当前位cur是否为0或者高位high是否为0来控制循环的进行。

  • 判断当前位cur:

    • 如果当前位cur大于1,说明在该位上可能出现1的次数为(high + 1) * num。
    • 如果当前位cur等于1,说明在该位上可能出现1的次数为high * num + low + 1。其中,high * num表示高位0到high-1的数字出现的次数(cur之前的高位),low表示低位0到low的数字出现的次数。
    • 如果当前位cur等于0,说明在该位上可能出现1的次数为high * num。
  • 更新变量:将num乘以10,表示进入下一位;更新cur为高位的个位数;将high除以10,舍弃掉最低位;更新low为n对num取余的结果,即低位0到low的数字。

  • 循环结束后,返回结果cnt,即在给定范围内数字1出现的总次数。

代码:

class Solution {
    public int countDigitOne(int n) {
        //高位,当前位,低位
        int high=n/10;
        int cur=n%10;
        int low=0;
        //个位
        int num=1;
        //记录次数
        int cnt=0;
        //注意循环条件,有可能当前位为0时高位有数字,例如10
        while(cur!=0||high!=0){
            if(cur>1) cnt+=(high+1)*num;
            else if(cur==1) cnt+=high*num+low+1;
            else cnt+=high*num;
            num*=10;
            cur=high%10;
            high/=10;
            low=n%num;
        }
        return cnt;
    }
}

结果:

 

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

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

相关文章

【C++杂货铺】模板(文末有彩蛋哟)

文章目录 一、泛型编程二、函数模板2.1 函数模板的原理2.2 函数模板的实例化2.3 模板参数的匹配原则 三、类模板四、非类型模板参数五、模板的特化5.1 函数模板特化5.2 类模板特化 六、模板分离编译七、模板总结好书推荐&#x1f381;彩蛋 一、泛型编程 &#x1f4d6;实现一个…

JDK17的下载安装与配置(详细教程)

1.搜索JDK的官方网址 https://www.oracle.com/java/technologies/downloads/#jdk17 2.切换到window系统&#xff0c;根据自己电脑的系统进行切换。然后点击下载 3.下载完成后移动你指定的文件夹并解压(这里放在了d盘目录下) 4.配置环境变量。打开我的电脑->点击属->找到…

「分享」Word文档被锁定无法编辑怎么办?4种方法解决

有没有遇到这种情况&#xff1f;打开Word文档后&#xff0c;发现文档被锁定了&#xff0c;无法输入内容&#xff0c;也无法修改&#xff0c;这很大可能是Word文档被设置了“限制编辑”。 如果Word文档被设置了“限制编辑”&#xff0c;而我们又需要编辑文档&#xff0c;可以用…

Python简要复习

西电Python程序设计复习 Python基础知识 python的特点 兼具编译型和解释型特性&#xff0c;兼顾过程式、函数式和面向对象编程范式的通用编程语言 解释型语言无需像编译型需要一次性的编译成机器码&#xff0c;然后运行&#xff0c;而是由名叫解释器的程序动态的将源代码逐…

Docker部署出现的问题

记录第一次使用Docker今天需要使用DockerFile文件在x86环境下部署镜像&#xff0c;给了我下面四个文件&#xff0c;让我生成首行的文件。 直接创建镜像报错 执行创造镜像命令 docker build -t wondersoft/ubuntu_scan_engine:latest .报错信息 报错原因&#xff1a; FROM …

数制系统——二、十、十六进制的相互转换

目录 1 二进制数制系统 1.1 二进制和 IPv4 地址 1.2 二进制位置记法 1.3 将二进制数转换为十进制数 1.4 十进制到二进制的转换 1.4.1 二进制和十进制互相转换游戏链接 1.5 Pv4 地址 2 十六进制数制系统 2.1 十六进制和 IPv6 地址 2.2 十进制到十六进制的转换 2.3 十…

【linux 结束pts/1踢人踢除另一个终端】

centos7上误执行了个命令&#xff0c;导致一直刷屏&#xff0c;强制CTRLC无法正常退出&#xff0c;一直出现如下&#xff1a; 网上搜索通过ctrlD&#xff0c;q均无法正常退出&#xff0c; 不想强行关掉&#xff0c;通过&#xff1a;who命令查看均用户&#xff1a; who mshns…

RocketMQ 行业分享

5.0的架构发生了重大调整&#xff0c;添加了一层rocketmq-proxy,可以通过grpc的方式接入。 参考 https://juejin.cn/post/7199413150973984827

plt绘制渐变颜色填充折线、曲线图

问题: 一般我们在绘制一些曲线或者折线图的时候需要进行颜色填充。例如 import matplotlib.pyplot as plt import numpy as npdata = np.loadtxt("0.txt").T x = data[0] y = data[1]fig, axs = plt.subplots(figsize=(4, 3)) axs.plot(x, y)# 设置xy轴范围 plt.x…

提升设计效率,深入解析CAD中的辅助命令

在CAD设计中&#xff0c;辅助命令是提高效率和精度的重要工具。无论是初学者还是有经验的设计师&#xff0c;掌握正确使用CAD中的辅助命令对于优化设计流程至关重要。本文将为你介绍一些常用的辅助命令&#xff0c;并分享如何正确运用它们来提升CAD设计的质量和效率。 正交函数…

无GPS下的自动驾驶系统解决方案

摘要&#xff1a; 随着自动驾驶技术的发展&#xff0c;在未知环境中智能汽车的定位技术成为该领域研究的核心。目前定位技术主要的解决方案是基于全球定位系统&#xff08;GPS&#xff09;&#xff0c;但是在某些特殊的环境中如下车库&#xff0c;没有 GPS 信号如何解决定位问…

(MYSQL)数据库服务端的启动与停止,登录与退出

MYSQL服务的启动与停止 方式一&#xff1a;右击左下角win图标——选择计算机管理——选择计算机管理&#xff08;本地&#xff09;——选择服务和应用程序——找到mysql&#xff08;此方法不好用&#xff09; 方式二&#xff1a;通过管理员身份运行&#xff08;必须是管理员身…

【C++11】——列表初始化、声明及STL变化

目录 1. C11简介 2. 统一的列表初始化 2.1 {}初始化 2.2 initializer_list容器 3. 声明 auto decltype nullptr 4. STL 中的一些变化 1. C11简介 在2003年C标准委员会曾经提交了一份技术勘误表(简称TC1)&#xff0c;使得C03这个名字已经取代了C98称为C11之前的最新C标…

正则表达式方法学习

正则表达式学习 1.能干嘛2.创建正则表达式3.关于正则表达式的方法3.1 正则的方法3.1.1 test3.1.2 compile3.1.3 exec捕获组对象具名捕获组对象非捕获组对象 3.2 String类型的对象的正则相关的方法3.2.1 search()3.2.2 replace()3.2.3 split()3.2.4 match()3.2.5 matchAll() 1.能…

电子科技大学入驻飞桨AI Studio高校专区,AI优质课程等你来学!

近日&#xff0c;电子科技大学高校专区在飞桨人工智能学习与实训社区AI Studio上线&#xff0c;双方将携手搭建人工智能教学实训平台专区&#xff0c;汇集优质教学实训资源&#xff0c;校企共同培育复合型 AI 人才&#xff0c;为国家输送高质量人才&#xff0c;促进国家智能化进…

13 Linux实操篇-Linux网络配置

13 Linux实操篇-Linux网络配置 文章目录 13 Linux实操篇-Linux网络配置13.1 NAT网络配置13.1.1 原理图讲解13.1.2 VMware虚拟网络编辑器13.1.3 查看Windows的网络配置-ipconfig13.1.4 查看Linux的网络配置-ifconfig13.1.5 网络检测检测工具-ping 13.2 Linux网络环境配置13.2.1 …

1400*B. Karen and Coffee

Examples input 3 2 4 91 94 92 97 97 99 92 94 93 97 95 96 90 100 output 3 3 0 4 input 2 1 1 1 1 200000 200000 90 100 output 0 解析&#xff1a; 题意为&#xff0c;给你多个区间&#xff08;会有重叠&#xff09;&#xff0c;每个区间的每个值都会为这个值累加…

server.max-http-header-size设置不当引发的线上OOM案例分析

问题现象 后台服务日志&#xff0c;大量报出如下异常&#xff0c;关键字&#xff1a;java.lang.OutOfMemoryError: Java heap space&#xff0c;问题指向&#xff1a;o.a.c.h.Http11NioProtocol [DirectJDKLog.java:175] Failed to complete processing of a request 问题定…

1071. 字符串的最大公因子

题目描述&#xff1a; 主要思路&#xff1a; ①&#xff1a;暴力依次判断每一段字符是否可以构成s和t ②&#xff1a;计算st串长度的最大公因子&#xff0c;判断是否可以构成 class Solution { public:bool check(string t,string s){string ans"";while(ans.lengt…

Squid代理配置

某些平台的服务需要配置白名单IP或服务器&#xff0c;我们配置了某个服务器&#xff0c;但是其他服务器也想访问这个平台&#xff0c;可以在白名单服务器上安装Squid&#xff0c;将其他服务器的服务代理到目标平台。 一、安装配置squid 首先在白名单服务器上安装squid: 1.切换…