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

Leetcode 剑指 Offer II 162. 数字 1 的个数

题目难度: 困难

原题链接

今天继续更新 Leetcode 的剑指 Offer(专项突击版)系列, 大家在公众号算法精选里回复剑指offer2就能看到该系列当前连载的所有文章了, 记得关注哦~

题目描述

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

示例 1:

  • 输入:num = 0
  • 输出:0

示例 2:

  • 输入:num = 13
  • 输出:6

提示:

  • 0 <= num < 109

题目思考

  1. 可否单独统计每一位上的 1?

解决方案

思路

  • 一个最简单的思路是从 1 到 num 依次遍历, 然后统计各个数字的 1 的数目并累加, 但观察题目数据规模, 最大都到了 2^31, 这个做法肯定会超时
  • 换个思路, 如果我们可以单独统计每一位上的 1 在多少个数中存在, 这样只需要遍历所有位数并累加结果即可
  • 举个例子, 假如num = 12x45, 现在要统计1~12x45在第 x 位上 1 的数目, 显然这里分为三种情况:
    • x < 1: 此时要想这一位上有 1, 那么前两位的范围只能是 0~11, 而后两位的范围则可以是 0~99, 也即00100, 00101, ..., 11199这么多种可能性, 只考虑该位上的 1, 那么它的数目就是左右取值范围的乘积, 也即12*100
    • x = 1: 此时显然仍包含第一种情况中的可能性, 但它有额外的部分, 也即前两位是 12, 然后后面的范围是 0~45, 加起来就是12*100 + 1*46个 1
    • x > 1: 此时仍包含第一种情况中的可能性, 但对于前两位是 12 来说, 后面的取值范围就是 0~99 了, 因为12199 < 12x45, 所以加起来就是12*100 + 1*100个 1
  • 综合这三种情况, 就能够计算出每一位上的 1 的数目, 最后累加起来就是总的 1 的数目
  • 注意x < 1的数目是所有情况下共享的, 所以可以先计算出这一部分, 然后针对x = 1x > 1再额外计算剩余部分, 从而减少代码冗余
  • 下面的代码对必要步骤有详细的解释, 方便大家理解

复杂度

  • 时间复杂度O(logN)
    • 只需要遍历 num 的每一位, 总位数是 logN
  • 空间复杂度O(1)
    • 不需要额外空间

代码

classSolution:defdigitOneInNumber(self,num:int)->int:# 对每一位进行判断, 左右相乘, 分大于等于小于1三种情况res=0# 将数字先转成字符串, 方便对每一位的处理s=str(num)fori,xinenumerate(s):# 对应x<1时的左边部分的取值范围# 注意对于最高位而言, 它的左边部分为0, 这是因为最高位不可能小于1, 所以这部分不应该有left=0ifi==0elseint(s[0:i])# 对应x<1时的右边部分的取值范围right=10**(len(s)-i-1)ifx<'1':# 当x<1时, 直接加上分析的左右部分乘积即可res+=left*rightelifx=='1':# 当x=1时, 需要额外加上右边的计数, 对于例子12x45 (x=1)来说, 就是46# 注意如果此时是最低位, 那么额外只有1种可能, 就是上限n本身, 所以最低位1的话只需要加上1extra=1ifi==len(s)-1elseint(s[i+1:])+1res+=left*right+extraelse:# 当x>1时, 需要额外加上1*rightres+=(left+1)*rightreturnres

大家可以在下面这些地方找到我~😊

我的 GitHub

我的 Leetcode

我的 CSDN

我的知乎专栏

我的头条号

我的牛客网博客

我的公众号: 算法精选, 欢迎大家扫码关注~😊

http://www.jsqmd.com/news/424337/

相关文章:

  • OPC们的屠龙刀推荐:InfiniSynapse
  • YOLOv13涨点改进| TGRS 2026 | 独家创新首发、特征融合改进篇| 引入GSFM 全局语义感知融合模块,突出小目标并抑制复杂背景干扰,适合小目标检测、红外小目标检测、小目标分割,高效涨点
  • 一文详解,如何用Spring使用Redis作为消息订阅?
  • 2026年知名的杭州大宅装修/杭州别墅大宅装修实力推荐 - 行业平台推荐
  • 2026年评价高的铝合金电缆桥架/电缆桥架小桥架源头厂家推荐几家 - 行业平台推荐
  • 2026年大牌小样加盟趋势:口碑品牌引领市场潮流,目前知名的大牌小样加盟品牌悦容庄国际专注行业多年经验,口碑良好 - 品牌推荐师
  • 2026年知名的红油豆瓣酱/岳轩圆白红油豆瓣酱值得信赖的生产厂家 - 品牌宣传支持者
  • 2026年口碑好的大连装修公司/中山区大连装修公司优选推荐 - 行业平台推荐
  • OpenClaw 的爆火,给所有 AI 开发者上了一课:技术不难,懂用户才难
  • 天猫超市卡快速变现攻略 - 团团收购物卡回收
  • 2026年口碑好的贯通黑线烤漆龙骨/龙骨专业制造厂家推荐 - 行业平台推荐
  • 2026年靠谱的工业设备防水微动开关/自动化系统防水微动开关厂家实力哪家强 - 行业平台推荐
  • 2026年热门的尼龙布牛津布/古池料布牛津布精选厂家推荐 - 品牌宣传支持者
  • 2026年知名的高耐磨氢化丁腈橡胶/高强度氢化丁腈橡胶源头工厂推荐 - 行业平台推荐
  • 2026年口碑好的冷拉异型钢方钢/冷拉异型钢圆钢实力厂家如何选 - 行业平台推荐
  • IoTDB 与 MyCat 集成,实现关系/时序数据无缝协同
  • 2026年质量好的碳钢冷拉型钢/冷拉型钢轨道钢长期合作厂家推荐 - 品牌宣传支持者
  • 中国学者推翻“干预常识”登顶Lancet子刊!精心设计的“多组分干预”竟不如“发宣传手册”?
  • 2026年镇江专业的货架厂家选购指南,哪家口碑好 - mypinpai
  • 定价冲突原因深层次分析
  • 2026年知名的古池料布箱包布/素色布箱包布值得信赖的生产厂家 - 品牌宣传支持者
  • 聊聊昆明艺术生专业培训,哪家机构性价比高详情分析 - 工业品网
  • 2026年口碑好的高分子分散剂/农药分散剂厂家综合实力对比 - 品牌宣传支持者
  • 探讨2026年合肥地区滨州青石材,哪家价格便宜又靠谱 - 工业设备
  • 2026年知名的半斤泡椒酱/泡椒酱供应商怎么选 - 品牌宣传支持者
  • 2026年热门的触变剂/防沉剂抗流挂触变剂销售厂家哪家好 - 品牌宣传支持者
  • Block押注AI,裁员40%,股价暴涨24%
  • 聊聊2026年河南好用的短视频推广公司,驻马店短视频营销推广服务联系方式 - 工业设备
  • 即时通讯源码带社交功能,跨平台支持iOS与Android端应用
  • 广东省内贵金属提炼供应商价格差异大,怎么选更合适? - 工业品网