L1-043 阅览室(java)

1. 题目描述

天梯图书阅览室请你编写一个简单的图书借阅统计程序。当读者借书时,管理员输入书号并按下S键,程序开始计时;当读者还书时,管理员输入书号并按下E键,程序结束计时。书号为不超过1000的正整数。当管理员将0作为书号输入时,表示一天工作结束,你的程序应输出当天的读者借书次数和平均阅读时间。

注意:由于线路偶尔会有故障,可能出现不完整的纪录,即只有S没有E,或者只有E没有S的纪录,系统应能自动忽略这种无效纪录。另外,题目保证书号是书的唯一标识,同一本书在任何时间区间内只可能被一位读者借阅。

输入格式:

输入在第一行给出一个正整数N(≤10),随后给出N天的纪录。每天的纪录由若干次借阅操作组成,每次操作占一行,格式为:

书号([1, 1000]内的整数) 键值SE发生时间hh:mm,其中hh是[0,23]内的整数,mm是[0, 59]内整数)

每一天的纪录保证按时间递增的顺序给出。

输出格式:

对每天的纪录,在一行中输出当天的读者借书次数和平均阅读时间(以分钟为单位的精确到个位的整数时间)。

输入样例:

3
1 S 08:10
2 S 08:35
1 E 10:00
2 E 13:16
0 S 17:00
0 S 17:00
3 E 08:10
1 S 08:20
2 S 09:00
1 E 09:20
0 E 17:00

输出样例:

2 196
0 0
1 60

2. 分析

将图书的书号作为键, 图书借出的时间作为值将借出的书存储再HashMap中, 然后还书的时候查询该书是否被借出, 若没有被借出, 则视为无效数据, 若被借出了, 现在需要还掉, 所以把该数据移出HashMap
这个很重要, 否则第一个测试点会通不过, 第一个测试点就是: 如果有多条借出数据, 以最后一条为准,如果有多条还书数据, 以第一条为准
因为HashMap存入数据, 如果键相同的情况下, 值会自动更新, 所以存入数据没有什么问题, 就是还书之后要将数据remove

3. 代码示例

import java.io.*;
import java.util.HashMap;

public class 阅览室 {
    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(bf.readLine());
        //定义一个HashMap,用于记录读者借阅还没有还的书籍
        HashMap<Integer, String> map = new HashMap<>();
        //记录读者借阅次数
        int count = 0;
        //计算总每天的阅读时间
        int sum = 0;
        while(n > 0){
            String[] line = bf.readLine().split(" ");
            int bookId = Integer.parseInt(line[0]);
            //当输入书号为0表示结束一天的工作
            if(bookId == 0){
                //计算这一天当中读者阅读次数和平均阅读时间
                if(sum == 0){
                    System.out.println(count + " " + 0);
                }else{
                    System.out.println(count + " " + (int)Math.round(1.0 * sum / count));
                }
                //清空map,开始计算新的一天的记录
                map.clear();
                count = 0;
                sum = 0;
                n--;
                continue;
            }
            //如果有多个借书记录数据,则以最后一个借书的数据为准
            //当读者借阅书籍
            if("S".equals(line[1])){
                map.put(bookId,line[2]);
            }
            //如果有多个还书的记录数据,则以第一个还书的数据为准
            //当该书籍被借阅,读者还书籍
            else if(map.containsKey(bookId) && "E".equals(line[1])){
                //计算该本书被阅读时间
                String[] t1 = map.get(bookId).split(":");
                String[] t2 = line[2].split(":");
                int hour = Integer.parseInt(t2[0]) - Integer.parseInt(t1[0]);
                int second = Integer.parseInt(t2[1]) - Integer.parseInt(t1[1]);
                sum += hour * 60 + second;
                //书被阅读一次
                count++;
                //书被还掉了,将该书籍清除
                map.remove(bookId);
            }
        }
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lilianac

你的鼓励是我的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值