问题描述
小U正在为一批商品编号,任务是根据给定的编号区间找出包含特定数字(5、20、520)的商品编号数量。每个编号区间包含若干个编号,我们需要分别计算出在这个区间内,包含数字“5”,包含数字“20”,以及包含数字“520”的编号数量。
输入
- 输入是一个编号区间,由两个整数L和R组成,表示编号区间的起始值和结束值(L <= R)。
输出
- 输出是一个包含三个整数的列表,分别表示在编号区间内包含数字“5”、“20”和“520”的编号数量。
示例
样例 1: 输入:L = 1, R = 20
输出:[2, 1, 0]
样例 2: 输入:L = 100, R = 1000
输出:[252, 19, 1]
样例 3: 输入:L = 520, R = 5200
输出:[1441, 187, 6]
解题思路
要解决这个问题,我们首先要明确需要做的事情:
- 遍历区间内的所有数字:给定一个区间
[L, R],我们需要检查每个数字,看它是否包含数字“5”,数字“20”或数字“520”。 - 检查数字是否包含特定字符串:我们可以将数字转化为字符串,利用字符串的
in操作符检查该数字是否包含目标字符串。 - 统计符合条件的数字数量:对每个区间内的数字,我们分别统计包含数字“5”,数字“20”和数字“520”的数字数量。
解决步骤
- 初始化计数器:我们用三个计数器分别记录区间内包含“5”、“20”和“520”的数字数量。
- 遍历区间内所有数字:使用
for循环遍历从L到R的所有数字。 - 检查每个数字是否包含目标字符串:对每个数字,转换成字符串并分别检查它是否包含“5”、“20”和“520”。
- 返回结果:返回一个包含三项计数的列表。
解题代码
pythonCopy Code
def solution(L: int, R: int) -> list:
# 初始化计数器
count_5 = 0
count_20 = 0
count_520 = 0
# 遍历区间内所有数字
for num in range(L, R + 1):
str_num = str(num) # 将数字转为字符串
# 检查是否包含数字5
if '5' in str_num:
count_5 += 1
# 检查是否包含数字20
if '20' in str_num:
count_20 += 1
# 检查是否包含数字520
if '520' in str_num:
count_520 += 1
# 返回包含三项计数的列表
return [count_5, count_20, count_520]
if __name__ == '__main__':
# 测试样例
print(solution(1, 20) == [2, 1, 0]) # 包含数字5有2个,包含数字20有1个,包含数字520有0个
print(solution(100, 1000) == [252, 19, 1]) # 包含数字5有252个,包含数字20有19个,包含数字520有1个
print(solution(520, 5200) == [1441, 187, 6]) # 包含数字5有1441个,包含数字20有187个,包含数字520有6个
解题思路详细解析
- 遍历区间:从L到R遍历每个数字。区间内的每个数字都需要检查是否包含特定的子字符串。这是通过将数字转为字符串,然后使用
in操作符检查该字符串是否包含“5”、“20”或“520”来实现的。 - 字符串检查:数字被转为字符串后,我们可以直接利用字符串的
in操作来判断数字是否包含目标子串。例如,'5' in '135'会返回True,表示数字135包含数字5。 - 时间复杂度:假设区间的长度为
n = R - L + 1,我们对每个数字进行一次字符串查找。检查每个数字是否包含目标数字的时间复杂度是O(m),其中m是该数字的位数(在最坏情况下,m大约为log(R))。因此,总时间复杂度是O(n * log(R))。对于较大的区间,我们可以预期程序仍然能高效运行。 - 空间复杂度:除了常数空间的计数器,我们只使用了一个字符串来存储当前数字。因此,空间复杂度为O(1)。
复杂度分析
- 时间复杂度:对于每个数字,我们需要将其转化为字符串并检查是否包含目标子串,因此时间复杂度为O(n * log(R)),其中n是区间内数字的个数,log(R)是数字的位数。
- 空间复杂度:我们只用了常数个额外的变量来存储计数,因此空间复杂度为O(1)。
总结
通过逐一检查区间内的每个数字是否包含目标数字,我们能够有效地解决问题。我们利用了字符串的 in 操作来简化查找过程,使得代码实现简洁且直观。通过对时间复杂度和空间复杂度的分析,我们确认了该算法在实际应用中的效率是可以接受的,尤其在较大的区间内表现良好。