【LeeCode】赛题03:Python解答门牌制作题目

本文解析了如何通过编程解决小蓝为2020户居民制作门牌的问题,利用Python计算数字2在1到2020号门牌中出现的频率,主要介绍了两种思路:逐个数字分析和按位数累计。最终通过HouseNum函数实现统计并返回结果。
摘要由CSDN通过智能技术生成

题目:门牌制作

小蓝要为一条街的住户制作门牌号。
这条街一共有 2020 位住户,门牌号从 1 到 2020 编号。
小蓝制作门牌的方法是先制作 0 到 9 这几个数字字符,最后根据需要将字符粘贴到门牌上,例如门牌 1017 需要依次粘贴字符 1、0、1、7,即需要 1 个字符 0,2 个字符 1,1 个字符 7。
请问要制作所有的 1 到 2020 号门牌,总共需要多少个字符 2?

解题分析:

思路一:
从1到2020共有2020个数字。我们把它转换为字符串,然后拆分为一个个字符组成的列表。
最后判断字符2是否在列表中即可。

思路二:
任何一个数字都是有小的单位累积的,如:十位数是由个位数累计的,百位数是由十位数累积的,千位数是由百位数累计的。
现在我们需要统计指定的个位数的频次,我们则进行十位数的过滤(以10为过滤的单位,单位的颗粒度小这样不会漏掉)。

以627为例: 627除以10求余数为7不满足,我们进行求商得62,商62再除以10得余数2满足计数一次,再用62除以10得到商6,
得到商6除以10的余数为0不满足,我们用6除以10得到商为0,跳出while循环。

不断的进行求商缩小其单位,将千位数的个位、十位、百位、千位依次得到并进行匹配计数。

Python解答:

def HouseNum(start_house_num,end_house_num, count_num):
    '''
    :param start_house_num: 起始的数字
    :param end_house_num: 终止的数字
    :param count_num: 要统计的数字
    :return: count 统计的数字次数
    '''
    count = 0
    for i in range(start_house_num, end_house_num+1):  # 左闭右闭 1,2020都可以取到
        temp = i
        while temp:
            if (temp % 10 == count_num):
                count += 1
            temp = int(temp/10)  # 这里区别一下C++中的取商符号: C++中直接取商整数,Python精确到小数
    return count


if __name__ == '__main__':
    res = HouseNum(1, 2020, 2)
    print(res)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值