Bootstrap

蓝桥杯真题:【15.小蓝的图书馆】(详解讲解版!!!)

蓝桥杯真题【15.小蓝的图书馆】(详解讲解版!!!)

题目链接

一、问题描述

小蓝是一个热爱阅读的年轻人,他有一个小型图书馆。为了能够管理他的书籍库存,他需要一个程序来记录图书的信息并执行两种操作:添加图书 add 和查找作者 find

初始小蓝没有书,给出 nn 个操作。addadd 操作给出两个字符串bookname,author、bookname,author,表示添加的图书图书名和作者;find 操作给出一个字符串 author,你需要输出小蓝的图书馆里这个 author有多少本图书。

输入格式

第一行一个整数 nn,表示有 nn 个操作。

之后 nn 行,给出操作及后面的参数,如题所述。

给出的字符串长度 lenlen 不超过 1010。

输出格式

对每一个 find操作,你需要输出这个作者在小蓝的图书馆有多少本书,注意是书的数量,不是不同书的数量,同时不同作者可能出现同名的书。

样例输入

7
find author1
add book1 author1
find author1
add book1 author1
find author1
add book1 author2
find author2

样例输出

0
1
2
1

代码逻辑解释

1. 初始化
  • Scanner scan:用于读取输入。
  • int num:读取操作次数。
  • Map<String, Integer> map:使用 HashMap 存储每个作者的计数,键是作者名,值是计数。
2. 主循环
  • 循环 num 次,每次处理一个操作。

  • 读取第一个字符串

    operation

    ,判断操作类型:

    • 如果是

      “s_find”

      • 读取作者名 s_author。
      • 输出 map.getOrDefault(s_author, 0),即该作者的计数(不存在则为 0)。
    • 否则(假设是添加操作):

      • 跳过一个字符串(可能是 “s_add” 或其他操作标识)。
      • 读取作者名 s_author。
      • 更新计数:map.getOrDefault(s_author, 0) + 1,然后存回 map。
3. 结束
  • 关闭 Scanner。

二、具体代码

import java.util.Scanner;
import java.util.Map;
import java.util.HashMap;

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int num = scan.nextInt();
        Map<String, Integer> map = new HashMap<>();
        
        for (int i = 0; i < num; i++) {
            String operation = scan.next();
            
            if (operation.equals("find")) {
                String s_author = scan.next();
                System.out.println(map.getOrDefault(s_author, 0));
            } else {
                scan.next();
                String s_author = scan.next();
                map.put(s_author, map.getOrDefault(s_author, 0) + 1);
            }
        }
        
        scan.close();
    }
}

三、后记

笔者在完成时,遇到了如下问题,以此记录下来

  • String 输入是 使用next();
  • 字符串判断使用 s.equals