华为OD机试 - 国际移动用户识别码(IMSI)匹配 - 递归(Java 2025 C卷 200分)

在这里插入图片描述

华为OD机试 2025C卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(A卷+E卷+B卷+C卷+D卷)》

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天优快云在线答疑。

一、题目描述

小明是核心网工程师,客户交给小明一个任务:给定一个网络配置列表,每个配置是一个字符串,仅有数字和"*“、”?"符号组成。

输入用户的IMSI(国际移动用户识别码),根据以下规则生成配置列表:

"*"匹配0个或多个任意字符。

"?“匹配下标为奇数的单个字符,比如123?中的”?"可以匹配123456789012345下标为3的字符’4’,下标从0开始。

二、输入描述

输入第一行为网络配置列表,列表中的每个配置由数字和*、?组成的字符串,每个字符串中*不超过一个,?若干,网络配置列表长度小于200,每个字符串以英文逗号隔开。

输入第二行为用户的IMSI(国际移动用户识别码),仅有数字组成,长度等于15。

备注

确保输入格式正确,无需考虑格式错误。

三、输出描述

输出为满足匹配规则的配置字符串列表,列表按照字典序升序输出,每个字符串以英文逗号隔开。若没有满足条件的配置,则返回字符串"null"。

四、测试用例

测试用例1:

1、输入

1234567,1234567*
123456789012345

2、输出

1234567*

3、说明

1234567长度不够无法匹配15位IMSI,1234567中的可以匹配剩余的89012345

测试用例2:

1、输入

123???345,123???*???345
123456789012345

2、输出

null

3、说明

123???345有16个字符,超过IMSI的15位
123???*???345中的?需要匹配奇数位置,但位置不对应

五、解题思路

1、主要解题思路

  1. 使用递归的方式实现配置字符串与IMSI的匹配
  2. 对于每个配置中的字符,根据其类型(数字、*、?)采用不同的匹配策略
  3. 特别处理*的回溯匹配,尝试匹配0个到多个字符
  4. ?只能匹配IMSI中下标为奇数位置的字符

2、数据结构:

ArrayList:存储所有匹配成功的配置字符串

String数组:存储分割后的配置列表

递归调用栈:用于回溯匹配

3、算法:

递归回溯算法:处理*的多种匹配可能性

字符串匹配算法:逐字符比对配置和IMSI

六、Java算法源码

public class OdTest {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 读取网络配置列表
        String configLine = scanner.nextLine();
        String[] configs = configLine.split(",");

        // 读取IMSI
        String imsi = scanner.nextLine();

        // 存储匹配成功的配置
        List<String> matchedConfigs = new ArrayList<>();

        // 遍历每个配置进行匹配
        for (String config : configs) {
            if (isMatch(config, imsi)) {
                matchedConfigs.add(config);
            }
        }

        // 如果没有匹配的配置,输出null
        if (matchedConfigs.isEmpty()) {
            System.out.println("null");
        } else {
            // 按字典序排序
            Collections.sort(matchedConfigs);
            // 输出结果,用逗号分隔
            System.out.println(String.join(",", matchedConfigs));
        }

        scanner.close();
    }

    /**
     * 判断配置是否能匹配IMSI
     * @param config 配置字符串
     * @param imsi IMSI字符串
     * @return 是否匹配
     */
    private static boolean isMatch(String config, String imsi) {
        return match(config, 0, imsi, 0);
    }

    /**
     * 递归匹配函数
     * @param config 配置字符串
     * @param cIdx 配置字符串当前索引
     * @param imsi IMSI字符串
     * @param iIdx IMSI字符串当前索引
     * @return 是否匹配
     */
    private static boolean match(String config, int cIdx, String imsi, int iIdx) {
        // 如果配置字符串已经遍历完
        if (cIdx == config.length()) {
            // 检查IMSI是否也遍历完
            return iIdx == imsi.length();
        }

        // 获取当前配置字符
        char c = config.charAt(cIdx);

        // 如果是*,尝试匹配0个或多个字符
        if (c == '*') {
            // 尝试匹配0个字符
            if (match(config, cIdx + 1, imsi, iIdx)) {
                return true;
            }
            // 尝试匹配1个或多个字符
            for (int i = iIdx; i < imsi.length(); i++) {
                if (match(config, cIdx + 1, imsi, i + 1)) {
                    return true;
                }
            }
            return false;
        }

        // 如果IMSI已经遍历完,但配置还有非*字符
        if (iIdx >= imsi.length()) {
            return false;
        }

        // 如果是?,检查是否在奇数位置
        if (c == '?') {
            // 只有在IMSI的奇数位置才能匹配
            if (iIdx % 2 == 1) {
                return match(config, cIdx + 1, imsi, iIdx + 1);
            } else {
                return false;
            }
        }

        // 如果是数字,必须完全匹配
        if (c == imsi.charAt(iIdx)) {
            return match(config, cIdx + 1, imsi, iIdx + 1);
        }

        return false;
    }
}

七、效果展示

1、输入

?2?4?6?8?0?2?4?,123456*012345,12345678901234?
123456789012345

2、输出

123456*012345

3、说明

?2?4?6?8?0?2?4?中的?需要匹配奇数位置,但数字在偶数位置不匹配
123456*012345中123456匹配前6位,*匹配789,012345匹配后6位
12345678901234?最后的?在位置14(偶数),不能匹配
在这里插入图片描述


🏆下一篇:华为OD机试 - 简易内存池 - 逻辑分析(Java 2025 C卷 200分)

🏆本文收录于,华为OD机试(JAVA)真题(A卷+E卷+B卷+C卷+D卷)

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天优快云在线答疑。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哪 吒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值