当前位置: 首页 > news >正文

LeetCode题练习与总结: 数字 1 的个数--233

一、题目描述

给定一个整数 n,计算所有小于等于 n 的非负整数中数字 1 出现的个数。

示例 1:

输入:n = 13
输出:6

示例 2:

输入:n = 0
输出:0

提示:

  • 0 <= n <= 10^9

二、解题思路

我们可以通过计算每一位上1出现的次数来解决这个问题。具体来说,我们可以使用以下步骤:

  • 遍历每一位(从个位开始),对于每一位,我们可以计算出以下三个部分:

    • 当前位之前的数字(prefix)
    • 当前位的数字(current)
    • 当前位之后的数字(suffix)
  • 对于每一位,我们可以计算出以下几种情况:

    • 如果当前位是0,那么1出现的次数就是prefix * digit
    • 如果当前位是1,那么1出现的次数就是prefix * digit + suffix + 1
    • 如果当前位大于1,那么1出现的次数就是(prefix + 1) * digit
  • 把每一位上1出现的次数累加起来就是最终的结果。

三、具体代码

class Solution {public int countDigitOne(int n) {int count = 0; // 用于存储1出现的次数int i = 1; // 表示当前位的权重,如个位是1,十位是10,百位是100等while (n / i > 0) {int prefix = n / (i * 10); // 当前位之前的数字int current = (n / i) % 10; // 当前位的数字int suffix = n - (n / i) * i; // 当前位之后的数字if (current == 0) {count += prefix * i;} else if (current == 1) {count += prefix * i + suffix + 1;} else {count += (prefix + 1) * i;}i *= 10;}return count;}
}

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 代码中有一个while循环,循环的条件是n / i > 0。在这个循环中,每次迭代都会将i乘以10,即i *= 10
  • 在最坏的情况下,i会一直增长直到i大于等于n。因为i每次迭代都会乘以10,所以i的增长速度是指数级的。
  • 假设nd位(dn的位数),那么循环将执行d次。因为每次i乘以10,所以循环体将执行大约log10(n)次。
  • 循环体内的操作都是常数时间的操作,所以总的时间复杂度是O(log10(n))
2. 空间复杂度
  • 代码中使用了固定数量的变量:countiprefixcurrentsuffix。这些变量不依赖于输入n的大小,因此它们占用的空间是常数级的。
  • 代码中没有使用任何额外的数据结构,如数组、列表或递归栈等,所以额外的空间使用是O(1)
  • 因此,总的空间复杂度是O(1)

五、总结知识点

  • 基础编程概念

    • 变量的声明与初始化:int count = 0; 和 int i = 1;
    • 循环结构:使用while循环来重复执行代码块,直到满足某个条件。
  • 数学运算

    • 整数除法:n / i用于获取数字的某一位。
    • 取余运算:(n / i) % 10用于获取当前位的数字。
    • 乘法运算:i *= 10用于更新位权重。
  • 逻辑判断

    • 条件语句:if-else用于根据当前位的值选择不同的计算方式。
  • 位操作与数学结合

    • 分割数字:将数字n分割为prefix(前缀)、current(当前位)和suffix(后缀)三部分,以便于分别处理。
    • 计算当前位1的出现次数:根据当前位是0、1还是大于1,来计算当前位上1出现的次数。
  • 算法思想

    • 数位动态规划:通过逐位分析数字,计算每一位上1出现的次数,并累加得到最终结果。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Resnet50网络——口腔癌病变识别
  • 在HTML中添加视频
  • Dell PowerEdge 网络恢复笔记
  • 胤娲科技:谷歌DeepMind祭出蛋白质设计新AI——癌症治疗迎来曙光
  • Thymeleaf
  • 网安面试题1
  • 计算机二级 MS office总结
  • 移植Linux:如何制作rootfs?
  • Alluxio Enterprise AI on K8s FIO 测试教程
  • 2024年中国研究生数学建模竞赛ABCDEF题【附带解题思路代码+结果】
  • 【RPA私教课:UIPath】RPA 赋能科技企业,登录时验证码自动截取
  • 详解npm源及其使用方法
  • 【农信网-注册/登录安全分析报告】
  • Parallels Desktop 20破解版(Mac虚拟机) v20.0.0 for Mac 最新商业版(支持M系列)
  • Linux介绍;Linux安装;Linux常见错误
  • JavaScript-如何实现克隆(clone)函数
  • (三)从jvm层面了解线程的启动和停止
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • Apache Zeppelin在Apache Trafodion上的可视化
  • CSS 三角实现
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • MobX
  • node和express搭建代理服务器(源码)
  • PHP的Ev教程三(Periodic watcher)
  • PV统计优化设计
  • vagrant 添加本地 box 安装 laravel homestead
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 用简单代码看卷积组块发展
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • # Redis 入门到精通(七)-- redis 删除策略
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (java)关于Thread的挂起和恢复
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (二)Kafka离线安装 - Zookeeper下载及安装
  • (二)Linux——Linux常用指令
  • (二)换源+apt-get基础配置+搜狗拼音
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (转) Android中ViewStub组件使用
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .NET6 开发一个检查某些状态持续多长时间的类
  • :如何用SQL脚本保存存储过程返回的结果集
  • @Query中countQuery的介绍
  • [ solr入门 ] - 利用solrJ进行检索
  • []FET-430SIM508 研究日志 11.3.31
  • [16/N]论得趣
  • [20170705]diff比较执行结果的内容.txt
  • [2023-年度总结]凡是过往,皆为序章
  • [AIGC] Java List接口详解
  • [Android] Android ActivityManager