小u的商品编号特殊含义统计 | 豆包MarsCode AI刷题

38 阅读3分钟

问题描述

小U正在给一批商品进行编号,他希望找出在特定区间内包含特定数字(5、20和520)的商品编号的数量。给定若干个编号区间,你需要分别计算出每个区间内包含数字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. 技术实现

    • 将数字转换为字符串后,利用字符串的 .contains() 方法检查是否包含目标子串。
    • 对每个数字进行独立的匹配,不存在交叉干扰。

代码实现

代码如下:

public static int[] solution(int L, int R) {
    int count5 = 0;    // 包含数字5的数量
    int count20 = 0;   // 包含数字20的数量
    int count520 = 0;  // 包含数字520的数量

    for (int i = L; i <= R; i++) {
        String numStr = String.valueOf(i);
        if (numStr.contains("5")) {
            count5++;
        }
        if (numStr.contains("20")) {
            count20++;
        }
        if (numStr.contains("520")) {
            count520++;
        }
    }

    return new int[]{count5, count20, count520};
}

测试样例

  • 示例输入输出:

    • 输入:L = 1, R = 20
      输出:[2, 1, 0]
      解释

      • 包含数字 5 的编号有:5, 15 → 共 2 个。
      • 包含数字 20 的编号有:20 → 共 1 个。
      • 不存在包含 520 的编号。
    • 输入:L = 100, R = 1000
      输出:[252, 19, 1]
      解释

      • 包含数字 5 的编号很多,如:105, 150 等,总共 252 个。
      • 包含数字 20 的编号有:120, 220, ...,共 19 个。
      • 包含数字 520 的编号有:520 → 共 1 个。

知识点总结

  1. 字符串匹配

    • String.contains(String target):检查目标字符串是否包含指定子串,返回布尔值。
    • 使用 .contains() 是处理类似问题的常用方法,灵活且高效。
  2. 数字与字符串互转

    • String.valueOf(int number):将数字转换为字符串。
    • 字符串匹配操作只能在字符串类型上进行,学会将数值类型与字符串类型互转是基本技能。
  3. 计数逻辑

    • 为每个目标子串("5"、"20"、"520")设置独立的计数器。
    • 遍历数字时,单独判断每种子串是否出现并相应累加。

复杂度分析

  1. 时间复杂度

    • 外层循环需要遍历区间内的每个数字,假设区间长度为 N=R−L+1N = R - L + 1N=R−L+1。
    • 对每个数字执行字符串匹配操作,假设数字平均长度为 ddd,匹配耗时 O(d)O(d)O(d)。
    • 总体复杂度为 O(N⋅d)O(N \cdot d)O(N⋅d)。
  2. 空间复杂度

    • 主程序使用常数级的变量(计数器、字符串变量),空间复杂度为 O(1)O(1)O(1)。

扩展思考

  1. 优化方向

    • 如果需要处理更大范围(如百万级)的区间,可以使用预计算和动态规划的方法,加速特定子串的计数统计。
    • 例如,用缓存保存某些区间的结果,避免重复计算。
  2. 应用场景

    • 类似问题广泛应用于数据过滤和模式匹配。
    • 在数据预处理、日志分析中,可以统计某些关键字的出现次数。