【232】 小U的特殊编号的商品含义| 豆包MarsCode AI刷题

100 阅读5分钟

问题描述

小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]

解题思路

要解决这个问题,我们首先要明确需要做的事情:

  1. 遍历区间内的所有数字:给定一个区间 [L, R],我们需要检查每个数字,看它是否包含数字“5”,数字“20”或数字“520”。
  2. 检查数字是否包含特定字符串:我们可以将数字转化为字符串,利用字符串的 in 操作符检查该数字是否包含目标字符串。
  3. 统计符合条件的数字数量:对每个区间内的数字,我们分别统计包含数字“5”,数字“20”和数字“520”的数字数量。

解决步骤

  1. 初始化计数器:我们用三个计数器分别记录区间内包含“5”、“20”和“520”的数字数量。
  2. 遍历区间内所有数字:使用 for 循环遍历从L到R的所有数字。
  3. 检查每个数字是否包含目标字符串:对每个数字,转换成字符串并分别检查它是否包含“5”、“20”和“520”。
  4. 返回结果:返回一个包含三项计数的列表。

解题代码

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个

解题思路详细解析

  1. 遍历区间:从L到R遍历每个数字。区间内的每个数字都需要检查是否包含特定的子字符串。这是通过将数字转为字符串,然后使用 in 操作符检查该字符串是否包含“5”、“20”或“520”来实现的。
  2. 字符串检查:数字被转为字符串后,我们可以直接利用字符串的 in 操作来判断数字是否包含目标子串。例如,'5' in '135' 会返回 True,表示数字135包含数字5。
  3. 时间复杂度:假设区间的长度为 n = R - L + 1,我们对每个数字进行一次字符串查找。检查每个数字是否包含目标数字的时间复杂度是O(m),其中m是该数字的位数(在最坏情况下,m大约为log(R))。因此,总时间复杂度是O(n * log(R))。对于较大的区间,我们可以预期程序仍然能高效运行。
  4. 空间复杂度:除了常数空间的计数器,我们只使用了一个字符串来存储当前数字。因此,空间复杂度为O(1)。

复杂度分析

  1. 时间复杂度:对于每个数字,我们需要将其转化为字符串并检查是否包含目标子串,因此时间复杂度为O(n * log(R)),其中n是区间内数字的个数,log(R)是数字的位数。
  2. 空间复杂度:我们只用了常数个额外的变量来存储计数,因此空间复杂度为O(1)。

总结

通过逐一检查区间内的每个数字是否包含目标数字,我们能够有效地解决问题。我们利用了字符串的 in 操作来简化查找过程,使得代码实现简洁且直观。通过对时间复杂度和空间复杂度的分析,我们确认了该算法在实际应用中的效率是可以接受的,尤其在较大的区间内表现良好。