华为OD机试 新系统 题库疯狂收录中刷题点这里专栏导读本专栏收录于《华为OD机试JAVA真题》。刷的越多抽中的概率越大私信哪吒备注华为OD加入华为OD刷题交流群每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景发现新题目随时更新全天CSDN在线答疑。一、题目描述给定一个停车场某一天的车辆出入记录请计算该停车场的当日收入收费规则如下• 停车半小时收费1元不足半小时按半小时计算。• 一辆车每天收费封顶15元。• 停车时间小于半小时则不收费• 11:30 - 13:30 不计入停车时间。• 包月的车辆不统计当日收入。二、输入描述第一段是购买了包月服务的车辆信息第一行是包月车辆的数量从第二行开始每行是一个包月的车牌号。第二段是当日车辆出入记录格式为时(24小时制):分 车牌号6~10位 enter/leave三、输出描述停车场当日收入整数。备注假设所有车辆在当天进当天离。每天的车辆出入记录10000条包月车辆个数小于10000。四、测试用例测试用例11、输入1A1234501:28 A12345 enter01:59 A12345 leave2、输出03、说明该车是包月车不计入收入。测试用例21、输入008:00 A12346 enter11:20 A12345 enter11:30 A12346 leave12:00 A12345 leave2、输出73、说明A1234608:00~11:30共 210 分钟收费 210/307 元。A1234511:20~12:00共 40 分钟但 11:30~12:00 这 30 分钟免费所以有效时长只有 10 分钟小于 30 分钟不收费。总收入 7。五、解题思路读取包月车列表存入 HashSet。按行读取当天的出入记录直到输入结束。遇到 enter记录该车的入场时间。遇到 leave找到对应的入场时间若是包月车直接忽略否则计算本次停车费用将费用累加到该车当天总费用中最多 15 元。最后把所有非包月车辆的费用求和输出。六、Java算法源码publicclassOdTest{// 免费时段开始11:30privatestaticfinalintFREE_START11*6030;// 免费时段结束13:30privatestaticfinalintFREE_END13*6030;// 每辆车每天收费封顶privatestaticfinalintCAP15;/** * 将 HH:mm 格式的时间转成分钟数 * 例如 * 01:28 - 88 * 13:30 - 810 */privatestaticintparseTime(StringtimeStr){String[]partstimeStr.split(:);inthourInteger.parseInt(parts[0]);intminuteInteger.parseInt(parts[1]);returnhour*60minute;}/** * 计算一段停车记录的有效停车分钟数 * 规则11:30 - 13:30 不计入停车时间 * * 计算方法 * 1、先算总时长 leave - enter * 2、再算这段停车时间和免费时段的重叠时长 * 3、有效时长 总时长 - 重叠时长 */privatestaticintgetEffectiveMinutes(intenterTime,intleaveTime){inttotalleaveTime-enterTime;// 求两段区间 [enterTime, leaveTime) 和 [FREE_START, FREE_END) 的重叠长度intoverlapMath.max(0,Math.min(leaveTime,FREE_END)-Math.max(enterTime,FREE_START));returntotal-overlap;}/** * 根据有效停车分钟数计算本次收费 * 规则 * 1、小于30分钟不收费 * 2、达到30分钟及以上每30分钟收费1元不足30分钟按30分钟算 */privatestaticintcalcFee(intminutes){if(minutes30){return0;}// 向上取整ceil(minutes / 30.0)return(minutes29)/30;}publicstaticvoidmain(String[]args){ScannerscnewScanner(System.in);// 如果没有输入直接结束if(!sc.hasNextInt()){return;}// 第一行包月车辆数量intnInteger.parseInt(sc.nextLine().trim());// 存包月车牌SetStringmonthlyCarsnewHashSet();// 读取包月车辆车牌for(inti0;in;i){monthlyCars.add(sc.nextLine().trim());}// 记录某辆车最近一次 enter 的入场时间MapString,IntegerenterMapnewHashMap();// 记录某辆车当天累计费用MapString,IntegerfeeMapnewHashMap();// 读取后续所有出入记录直到 EOFwhile(sc.hasNextLine()){Stringlinesc.nextLine().trim();// 跳过空行if(line.isEmpty()){break;}String[]arrline.split(\\s);StringtimeStrarr[0];Stringplatearr[1];Stringactionarr[2];// 包月车不计入收入直接忽略其出入记录if(monthlyCars.contains(plate)){continue;}intcurrentTimeparseTime(timeStr);if(enter.equals(action)){// 记录入场时间enterMap.put(plate,currentTime);}elseif(leave.equals(action)){// 找到对应入场时间IntegerenterTimeenterMap.remove(plate);// 理论上题目保证当天进当天离这里做健壮性保护if(enterTimenull){continue;}// 计算本次有效停车时间inteffectiveMinutesgetEffectiveMinutes(enterTime,currentTime);// 计算本次费用intfeecalcFee(effectiveMinutes);// 累加到该车当天总费用并做15元封顶inttotalFeefeeMap.getOrDefault(plate,0)fee;feeMap.put(plate,Math.min(CAP,totalFee));}}// 汇总所有非包月车辆当天收费inttotalIncome0;for(intfee:feeMap.values()){totalIncomefee;}// 按要求输出整数不要输出额外提示文字System.out.print(totalIncome);}}七、效果展示1、输入009:00 C11111 enter12:00 C11111 leave14:00 C11111 enter16:00 C11111 leave2、输出93、说明同一辆车两次停车第一次09:00~12:00共 180 分钟免费时段重叠 11:30~12:00共 30 分钟有效时长 150 分钟收费 150/305 元第二次14:00~16:00共 120 分钟不与免费时段重叠收费 120/304 元总计 9 元。下一篇华为OD机试 - 简易内存池 - 逻辑分析Java 新系统 200分本专栏收录于《华为OD机试JAVA真题》。刷的越多抽中的概率越大私信哪吒备注华为OD加入华为OD刷题交流群每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景发现新题目随时更新全天CSDN在线答疑。