题目描述
给定两个字符集合,一个是全量字符集,一个是已占用字符集,已占用字符集中的字符不能再使用。
要求输出剩余可用字符集。
输入描述
- 输入一个字符串 一定包含@,@前为全量字符集 @后的为已占用字符集
- 已占用字符集中的字符一定是全量字符集中的字符
- 字符集中的字符跟字符之间使用英文逗号隔开
- 每个字符都表示为字符+数字的形式用英文冒号分隔,比如a:1标识一个a字符
- 字符只考虑英文字母,区分大小写
- 数字只考虑正整型 不超过100
- 如果一个字符都没被占用 @标识仍存在,例如 a:3,b:5,c:2@
输出描述
- 输出可用字符集
- 不同的输出字符集之间用回车换行
- 注意 输出的字符顺序要跟输入的一致,如下面用例不能输出b:3,a:2,c:2
- 如果某个字符已全部占用 则不需要再输出
用例
输入 | a:3,b:5,c:2@a:1,b:2 |
输出 | a:2,b:3,c:2 |
说明 |
|
题目解析
考察字符串操作
2023.06.30
增加处理:7、如果一个字符都没被占用 @标识仍存在,例如 a:3,b:5,c:2@
JavaScript算法源码
/* JavaScript Node ACM模式 控制台输入获取 */
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
rl.on("line", (line) => {
const sArr = line.split("@");
if (sArr.length == 1) return sArr[0];
const [all, used] = sArr.map((str) =>
str.split(",").map((kv) => kv.split(":"))
);
const remain = new Map(all);
used.forEach((kv) => {
const [key, val] = kv;
const newVal = remain.get(key) - val;
if (newVal > 0) {
remain.set(key, newVal);
} else {
remain.delete(key);
}
});
const ans = [];
for (let entry of remain.entries()) {
ans.push(entry.join(":"));
}
console.log(ans.join(","));
});
Java算法源码
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.next();
System.out.println(getResult(str));
}
public static String getResult(String str) {
String[] sArr = str.split("@");
if (sArr.length == 1) {
return sArr[0];
}
String[][][] tmp =
Arrays.stream(sArr)
.map(
s1 ->
Arrays.stream(s1.split(",")).map(s2 -> s2.split(":")).toArray(String[][]::new))
.toArray(String[][][]::new);
String[][] all = tmp[0];
String[][] used = tmp[1];
// 注意 输出的字符顺序要跟输入的一致,如用例不能输出b:3,a:2,c:2
// 因此这里用LinkedHashMap维护输入顺序
LinkedHashMap<String, Integer> allMap = new LinkedHashMap<>();
for (String[] arr : all) {
allMap.put(arr[0], Integer.parseInt(arr[1]));
}
HashMap<String, Integer> usedMap = new HashMap<>();
for (String[] arr : used) {
usedMap.put(arr[0], Integer.parseInt(arr[1]));
}
for (String key : usedMap.keySet()) {
if (allMap.containsKey(key)) {
int remain = allMap.get(key) - usedMap.get(key);
if (remain > 0) {
allMap.put(key, remain);
} else {
allMap.remove(key);
}
}
}
StringJoiner sj = new StringJoiner(",");
for (Map.Entry<String, Integer> entry : allMap.entrySet()) {
sj.add(entry.getKey() + ":" + entry.getValue());
}
return sj.toString();
}
}
Python算法源码
# 输入获取
s = input()
# 算法入口
def getResult():
all, used = s.split("@")
if used == "":
return all
allMap = {}
for k, v in list(map(lambda x: x.split(":"), all.split(","))):
allMap[k] = int(v)
usedMap = {}
for k, v in list(map(lambda x: x.split(":"), used.split(","))):
usedMap[k] = int(v)
for k in usedMap.keys():
# 已占用字符集中的字符一定是全量字符集中的字符
diff = allMap[k] - usedMap[k]
if diff > 0:
allMap[k] = diff
else:
# 如果某个字符已全部占用 则不需要再输出
allMap.pop(k)
return ",".join(map(lambda x: ":".join(map(str, x)), allMap.items()))
# 算法调用
print(getResult())
免责声明:
1、IT资源小站为非营利性网站,全站所有资料仅供网友个人学习使用,禁止商用
2、本站所有文档、视频、书籍等资料均由网友分享,本站只负责收集不承担任何技术及版权问题
3、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除下载链接并致以最深的歉意
4、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
5、一经注册为本站会员,一律视为同意网站规定,本站管理员及版主有权禁止违规用户
6、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和IT资源小站的同意
7、IT资源小站管理员和版主有权不事先通知发贴者而删除本文
评论0