Offer 43. 1~n 整数中 1 出现的次数 (找规律 困难)

该博客探讨了1到n整数中1出现的次数问题,通过解析密码锁的思路,提出了一种解决方案。博主分析了不同位数上1可能出现的情况,并给出三种主要情形:值等于1、小于1和大于1。根据这些情况,博主提供了时间复杂度为O(m)、空间复杂度为O(1)的算法,用于计算1的总频次。
摘要由CSDN通过智能技术生成

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

题目:1~n 整数中 1 出现的次数
思路:(参考力扣上Krahets大佬的题解以及ryan0414的解释):
               可以参考密码锁   进而找规律
复杂度:   时间复杂度O(m) (m为n的位数)    空间复杂度 O(1)

'''
    题目:1~n 整数中 1 出现的次数
    思路(参考力扣上Krahets大佬的题解以及ryan0414的解释):
        可以参考密码锁 如n=abcd 即有四位密码
           ① 我们求abcd出现1的可能可以分为 求每位出现1可能的累加
           ②当我们求b位上出现密码值为 1 的个数上时(我们记a=high cd=low) 只需要将b位置1 求其他位的可能组合即为子问题的解,此时分为以下几种情况
              i    当 b 的值恰好为1   n = a1cd  此时求 000-acd的大小即可  acd-0+1 = high*100 + low + 1
              ii   当 b 的值小于1    n = a0cd  如果b位置想出现1 a必须要降一位  而此时cd都可以取9 即此时求 000-(a-1)99的范围大小即可  (a-1)99 - 0 + 1 = a00 = high*100
              iii  当 b 的值大于1    n = a2cd  如果b位置想出现1 cd可以取9  即此时求 000-a99的范围大小即可  a99-0+1 = (a+1)00 = (high+1)*100
           ③ 我们将4中可能累加
    复杂度:   时间复杂度O(m) (m为n的位数)    空间复杂度 O(1)
'''

def countDigitOne(n):
    n_str = str(n)
    count = len(n_str)
    value = 1
    res = 0

    for i in range(count):
        # 使用字符来求high和low
        high_str = n_str[:i]
        if high_str == '':
            high = 0
        else:
            high = int(high_str)

        if i == count-1:       # 注意此处的条件  当i取得最后一位时
            low = 0
        else:
            low = int(n_str[i+1:])

        # 三种情况讨论
        if int(n_str[i]) == value:
            res += high * pow(10, count-1-i) + low + 1
        elif int(n_str[i]) < value:
            res += high * pow(10, count-1-i)
        else:
            res += (high + 1) * pow(10, count-1-i)
    return res

路虽远,行则将至。事虽难,做则必成 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值