(B卷,100分)- 全量和已占用字符集(Java & JS & Python)

题目描述

给定两个字符集合,一个是全量字符集,一个是已占用字符集,已占用字符集中的字符不能再使用。

要求输出剩余可用字符集。

输入描述

  1. 输入一个字符串 一定包含@,@前为全量字符集 @后的为已占用字符集
  2. 已占用字符集中的字符一定是全量字符集中的字符
  3. 字符集中的字符跟字符之间使用英文逗号隔开
  4. 每个字符都表示为字符+数字的形式用英文冒号分隔,比如a:1标识一个a字符
  5. 字符只考虑英文字母,区分大小写
  6. 数字只考虑正整型 不超过100
  7. 如果一个字符都没被占用 @标识仍存在,例如 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
说明
  • 全量字符集为三个a,5个b,2个c
  • 已占用字符集为1个a,2个b
  • 由于已占用字符不能再使用
  • 因此剩余可用字符为2个a,3个b,2个c
  • 因此输出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

评论0

站点公告

没有账号?注册  忘记密码?