题目:门牌制作
小蓝要为一条街的住户制作门牌号。
这条街一共有 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)