算法的学习笔记—从 1 到 n 整数中 1 出现的次数(牛客JZ43)

news2024/11/16 19:28:32

img

😀前言
在编程面试中,求解从 1 到 n 的整数中数字 1 出现的次数是一个常见的挑战。该问题的关键在于如何高效地统计数字 1 出现的次数。本文将详细分析该问题的解题思路,并提供一个高效的 Java 实现。

🏠个人主页:尘觉主页

文章目录

  • 🥰从 1 到 n 整数中 1 出现的次数
    • 😀问题描述
      • 示例1
      • 示例2
    • 🤔解题思路
    • 💝Java 实现
      • ❤️‍🔥代码详解
        • ❤️‍🔥复杂度分析
    • 😄总结

🥰从 1 到 n 整数中 1 出现的次数

NowCoder

😀问题描述

给定一个整数 n,求从 1 到 n 的所有整数中,数字 1 在各个位数上出现的次数。例如,在 1 到 13 中,包含 1 的数字有 1、10、11、12、13,因此数字 1 出现了 6 次。

注意:11 这种情况算两次

数据范围: 1≤n≤30000

进阶:空间复杂度 O(1) ,时间复杂度 O(lognn)

示例1

输入:13

返回值:6

示例2

输入:0

返回值:0

🤔解题思路

直接遍历从 1 到 n 的每一个整数并统计其中出现的 1 的次数是最直观的方法,但这种方法的时间复杂度为 O(n log n),在 n 较大时效率较低。为了解决这个问题,我们可以使用数学方法来提高效率。

该问题的解法可以基于以下几点进行优化:

  1. 逐位计算:我们可以从个位、十位、百位等逐位计算每一位上 1 出现的次数。
  2. 数字分段:对于任意一个数位,我们将 n 分为三个部分:高位、中间位、低位。具体来说,如果我们正在计算某一位上 1 出现的次数,我们可以将 n 分为三个部分:
    • 高位部分 a:比当前位更高的数字。
    • 当前位 m:当前正在计算的位。
    • 低位部分 b:比当前位更低的数字。
  3. 数学推导:根据高位和当前位的值,可以推导出当前位上 1 出现的次数:
    • 当当前位上的数字小于 1 时,1 的出现次数仅取决于高位部分;
    • 当当前位上的数字等于 1 时,1 的出现次数不仅取决于高位部分,还与低位部分相关;
    • 当当前位上的数字大于 1 时,1 的出现次数受高位部分的影响。

根据上述思路,我们可以写出如下代码:

💝Java 实现

public int NumberOf1Between1AndN_Solution(int n) {
    int cnt = 0; // 用于统计1出现的次数
    for (int m = 1; m <= n; m *= 10) { // 遍历每一位
        int a = n / m; // 高位部分
        int b = n % m; // 低位部分
        // (a + 8) / 10 * m 用于计算高位的影响
        // (a % 10 == 1 ? b + 1 : 0) 用于处理当前位是1的情况
        cnt += (a + 8) / 10 * m + (a % 10 == 1 ? b + 1 : 0);
    }
    return cnt; // 返回1出现的总次数
}

❤️‍🔥代码详解

  1. 变量初始化cnt 用于累计数字 1 出现的次数。m 是用于定位当前位的权重,初始为 1。
  2. 逐位计算:通过 m *= 10 循环遍历每一位数字。a 表示当前位的高位部分,b 表示当前位的低位部分。
  3. 1 的出现次数计算
    • (a + 8) / 10 * m:这是一个简化的计算方式,用于判断在当前位上,1 出现的次数受高位的影响。(a + 8) / 10 处理了高位部分的影响。
    • a % 10 == 1 ? b + 1 : 0:用于处理当前位是 1 的情况。如果当前位为 1,则加上低位部分的值 b + 1,否则加 0。
  4. 返回结果:最终 cnt 的值就是从 1 到 n 中数字 1 出现的总次数。
❤️‍🔥复杂度分析

该算法的时间复杂度为 O(log n),因为我们遍历的次数与 n 的位数有关,而空间复杂度为 O(1),仅使用了常量级的额外空间。

😄总结

通过逐位分析和数学推导,我们可以高效地求解从 1 到 n 的整数中 1 出现的次数。该算法比直接遍历方法更高效,尤其适用于较大的 n。

😁热门专栏推荐
想学习vue的可以看看这个

java基础合集

数据库合集

redis合集

nginx合集

linux合集

手写机制

微服务组件

spring_尘觉

springMVC

mybits

等等等还有许多优秀的合集在主页等着大家的光顾感谢大家的支持

🤔欢迎大家加入我的社区 尘觉社区

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😁
希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞

img

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

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

相关文章

java 切面日志打印出参入参

切面Controller出入参日志打印 项目结构 切面日志对controller下所有的方法生效 切面代码 Slf4j Aspect Component public class ControllerLogAspect {// 定义一个切点&#xff0c;拦截所有Controller层的public方法Before("execution(public * com.jzt.market.cont…

Android解析异步消息处理机制

文章目录 Android解析异步消息处理机制MessageHandlerMessageQueueLooper Android解析异步消息处理机制 Android中的异步消息处理主要由4个部分组成&#xff1a;Message、Handler、MessageQueue和Looper。其中Message和Handler在上一小节中我们已经接触过了&#xff0c;而Mess…

大数据基础:离线与实时数仓区别和建设思路

文章目录 离线与实时数仓区别和建设思路 一、离线数仓与实时数仓区别 ​​​​​​​二、实时数仓建设思路 离线与实时数仓区别和建设思路 ​​​​​​​一、离线数仓与实时数仓区别 离线数据与实时数仓区别如下&#xff1a; 对比方面 离线数仓 实时数仓 架构选择 传…

ComsolMatlab 两级串联扩张式消声器仿真解与解析解

消声器的声学性能通常要求消声器在工作频率范围内有较大的消声量以及较宽的消声频带。常用的消声器声学性能评价指标通常有传递损失、插入损失、减噪量三种。其中插入损失只能反映整个系统在安装消声器前后声学特性的变化&#xff0c;并不能直接反映消声器本身单独具有的属性。…

计算机毕业设计选题推荐-中药材进存销管理系统-Java/Python项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

假期学习--对象底层结构和继承链

OC本质底层实现转化其实都是C/C代码。 OC对象的本质就是结构体。 NSObject底层是struct objc_object结构体 &#xff1b;struct objc_class : objc_object { …省略无关代码 // Class ISA; //ISA(从objc_object继承过来的) Class superclass; //指向其父类 cache_t cache…

王伊朵闪耀“快乐阳光”舞台 再夺全国冠军

在近日落幕的“赛克杯”第20届快乐阳光少年儿童歌曲卡拉OK电视大赛全国总决赛中&#xff0c;就读于北京市建华实验学校&#xff0c;年仅11岁的小选手王伊朵以其出色的唱功和卓越的舞台表现&#xff0c;一举夺得全国冠军&#xff0c;成为本次大赛一颗耀眼的小明星。 王伊朵自小对…

基于NNG的六种通信模式

NNG是一个消息传递框架&#xff0c;用来解决常见的消息传递问题。NNG是nanomsg的继任版本&#xff0c;纯c语言开发&#xff0c;工作模式分为一下几种&#xff1a; Pipeline单向管道 此模式可用于解决生产者/消费者问题&#xff0c;包括负载均衡。 消息从推侧流向拉侧。 如果多…

‌U盘闪一下就没了?‌如何有效恢复数据

在日常使用U盘的过程中&#xff0c;‌我们可能会遇到一种突发情况&#xff1a;‌U盘插入电脑后仅仅闪了一下就消失了&#xff0c;‌无法再被识别或访问。‌这种情况下&#xff0c;‌U盘中的数据似乎瞬间变得遥不可及。‌然而&#xff0c;‌不必过于担心&#xff0c;‌因为仍然有…

Kafka消息积压的典型场景及解决方案

Kafka消息积压的典型场景&#xff1a; 1.实时/消费任务挂掉 比如&#xff0c;我们写的实时应用因为某种原因挂掉了&#xff0c;并且这个任务没有被监控程序监控发现通知相关负责人&#xff0c;负责人又没有写自动拉起任务的脚本进行重启。 那么在我们重新启动这个实时应用进行…

【Docker】构建Harbor仓库

下载软件包地址&#xff1a;https://github.com/goharbor/harbor/releases Harbor 是由vmware公司开源的企业级 Docker Registry 项目。 它提供了以下主要功能和特点&#xff1a; 1. 基于角色的访问控制&#xff08;RBAC&#xff09;&#xff1a;可以为不同的用户和用户组分…

告别繁琐!Xinstall地推码,让App安装统计变得更简单!

Xinstall地推码&#xff1a;开启App推广新篇章 在移动互联网时代&#xff0c;App推广的重要性不言而喻。然而&#xff0c;传统的推广方式往往伴随着繁琐的操作和难以精准统计的数据&#xff0c;让推广者头疼不已。幸运的是&#xff0c;Xinstall作为国内专业的App全渠道统计服务…

EmguCV学习笔记 VB.Net 6.6 图像的矩

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…

【保姆级WebStorm安装!!!】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

记录|Form1中嵌套Form2时的频闪问题解决[不同于常见的三部曲]

目录 前言一、常见的解决方案二、自己创建渐变色组件GradientPanel三、最终效果展示更新时间 前言 参考文章&#xff1a; C#画图解决闪烁问题 [解决winform中重绘时控件闪烁的问题](panel1.GetType().GetProperty(“DoubleBuffered”,System.Reflection.BindingFlags.Instance …

试卷擦除,这几款软件擦得干干净净!

在现代教育中&#xff0c;电子化试卷已经成为一种趋势&#xff0c;然而随之而来的问题是如何有效地擦除试卷上的答案&#xff0c;以便进行反复使用试卷。为了解决这个问题&#xff0c;我们介绍了三款试卷答案清除方法&#xff0c;这些方法不仅简单易用&#xff0c;而且效果显著…

运维团队如何高效使用监控易

监控易作为一款功能强大的运维监控工具&#xff0c;能够为运维团队提供全面、实时的设备运行状态和性能指标。为了高效使用监控易&#xff0c;运维团队应遵循以下步骤和策略&#xff1a; 一、熟悉监控易界面与功能 深入了解监控易的仪表盘界面&#xff0c;包括设备运行状态、…

APP自动化测试思路整理,跟着步骤快速撸码...

前言 1、开发语言选择 通常用于自动化测试的编程语言有&#xff1a;Python、Java、Javascript、Ruby、C#、PHP等。 一般我们会选择自己熟悉的编程语言来编写自动化脚本&#xff0c;但对于编程基础基本为0的童鞋&#xff08;或者专注于做自动化测试的童鞋&#xff09;&#x…

ICT测试探针市场报告:前五大厂商占有大约26.0%的市场份额

ICT测试探针&#xff0c;即在线测试&#xff08;ICT&#xff09;探针&#xff0c;是专门用于电路板&#xff08;特别是PCBA&#xff09;电气测试的重要工具&#xff0c;通过这些探针接触PCB上的测试点&#xff0c;来检测电路板上元器件的连通性和电气性能&#xff0c;从而保证电…

视频超分辨率重建——AnimeSR网络测试教程(详细图文教程)

&#x1f4aa; 专业从事且热爱图像处理&#xff0c;图像处理专栏更新如下&#x1f447;&#xff1a; &#x1f4dd;《图像去噪》 &#x1f4dd;《超分辨率重建》 &#x1f4dd;《语义分割》 &#x1f4dd;《风格迁移》 &#x1f4dd;《目标检测》 &#x1f4dd;《暗光增强》 &a…