华为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、主要解题思路
- 使用递归的方式实现配置字符串与IMSI的匹配
- 对于每个配置中的字符,根据其类型(数字、*、?)采用不同的匹配策略
- 特别处理*的回溯匹配,尝试匹配0个到多个字符
- ?只能匹配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算法的适用场景,发现新题目,随时更新,全天优快云在线答疑。