目录
- 专栏导读
- 一、题目描述
- 二、输入描述
- 三、输出描述
- 四、解题思路
- 五、Java算法源码
- 六、效果展示
- 1、输入
- 2、输出
华为OD机试 2023B卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。
一、题目描述
给定两个字符集合,一个是全量字符集,一个是已占用字符集,已占用字符集中的字符不能再使用。
二、输入描述
- 输入一个字符串 一定包含@,@前为全量字符集 @后的为已占用字符集;
- 已占用字符集中的字符一定是全量字符集中的字符;
- 字符集中的字符跟字符之间使用英文逗号隔开;
- 每个字符都表示为字符+数字的形式用英文冒号分隔,比如a:1标识一个a字符;
- 字符只考虑英文字母,区分大小写;
- 数字只考虑正整型,不超过100;
- 如果一个字符都没被占用 @标识仍存在,例如 a:3,b:5,c:2@
三、输出描述
- 输出可用字符集;
- 不同的输出字符集之间用回车换行;
- 注意 输出的字符顺序要跟输入的一致,如下面用例不能输出b:3,a:2,c:2;
- 如果某个字符已全部占用,则不需要再输出
四、解题思路
这道题较为简单:
- @前为全量字符集 @后的为已占用字符集,求剩余字符个数;
- 将全量字符集放入map中(key:字符,value:字符对应数量);
- 再遍历已占用的字符,将其key对应的数量减去;
- 如果某个字符已全部占用,则不需要再输出
五、Java算法源码
package com.guor.od;
import java.util.*;
public class OdTest02 {
/**
* 不考虑输入不合规的情况
*/
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String input = sc.nextLine();
String[] lineArr = input.split("@");
// 全量字符集
String[] allCharNum = lineArr[0].split(",");
String[] usedCharNum = {};
if(lineArr.length != 1){
// 已占用字符集
usedCharNum = lineArr[1].split(",");
}
/**
* 全量字符集map
* key:字符
* value:字符对应数量
*/
Map<String, Integer> map = new HashMap<String, Integer>();
for (String charSum : allCharNum) {
String[] split = charSum.split(":");
String key = charSum.split(":")[0];
int sum = Integer.parseInt(charSum.split(":")[1]);
map.put(key, sum);
}
// 对应字符减去已占用的数量
for (String charSum : usedCharNum) {
String key = charSum.split(":")[0];
int sum = Integer.parseInt(charSum.split(":")[1]);
// 字符总数 - 已占用的数量
int leave = map.get(key) - sum;
// 如果某个字符已全部占用,则不需要再输出
if(leave == 0){
map.remove(key);
}else{
map.put(key, leave);
}
}
// 不同的输出字符集之间用回车换行
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + ":" + entry.getValue());
}
}
}
六、效果展示
1、输入
a:5,b:6,c:7,d:8@a:5,d:3,b:2
2、输出
b:4
c:7
d:5
🏆下一篇:华为OD机试真题 Java 实现【简易内存池】【2023 B卷 200分 考生抽中题】
🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。