目录
题目
思路
Code
题目
题目内容:
请开发一个快递驿站计费系统,根据给定的一组快递存取记录,系统计费每位业主要缴纳的总费用,并按总费用从高到低输出。
系统计费规则如下:
免费存放时间为 12 小时,从存件时间开始计时,总存放时间 ⩽12 小时不收费,存放时间 = 取件时间 − 存件时间;
超出免费存放时间的,每 12 小时收取 1 元,不足 12 小时按 12 小时计算,比如存放了 25 个小时,超出免费时间 13 小时,需要收费 2 元;
同一个房间号的业主,可能有多条存取记录,需要将业主所有快递的超时费用累加得到总费用。
输入描述:
输入二维数组,每条记录依次是存件时间、取件时间和房间号。0 <= 存件时间 <= 取件时间 <= 100000,100 < 房间号 < 10000,1 <= 记录数 <= 1000。
输出描述:
输出 [房间号,总费用] 数组,按费用降序;费用相同按房间号升序。
样例 1
输入:
[[100, 110, 1111], [200, 210, 2222], [150, 165, 3333], [180, 190, 1111]]输出:
[[3333,1],[1111,0],[2222,0]]样例 2
输入:
[[10, 30, 303], [25, 50, 303], [40, 70, 201], [60, 90, 201], [100, 130, 102], [150, 180, 102]]输出:
[[102,4],[201,4],[303,3]]思路
整体思路:逐条计算费用,按房间聚合后双关键字排序。
第一步:每三个整数还原一条存取记录。
第二步:对超过 12 小时的部分除以 12 并向上取整。
第三步:按房间累计,再按费用降序和房间号升序排序。
边界处理:零费用房间仍输出;恰好 12 小时免费,恰好 24 小时收费 1 元。
复杂度分析:时间 O(N+R log R),空间 O(R)。
Code
import re import sys from collections import defaultdict # 输入整数每三个还原为存件时间、取件时间和房间号。 # 同一房间可能出现多次,每处理一条记录就把本单费用加到该房间已有总费用上。 # 循环下标每次增加 3,因此第 i、i+1、i+2 个数字始终属于同一条快递记录。 numbers = list(map(int, re.findall(r"\d+", sys.stdin.read()))) fees = defaultdict(int) for i in range(0, len(numbers), 3): stored, picked, room = numbers[i:i + 3] duration = picked - stored # 12 小时内免费,超时部分按 12 小时一档向上取整。 # 例如存放 25 小时会超时 13 小时,(13+11)/12 的整数除法结果为 2 元。 fees[room] += 0 if duration <= 12 else (duration - 12 + 11) // 12 # 费用降序优先,并列时房间号升序。 # 比较器先看费用;只有费用相等时才比较房间号,避免并列结果顺序不确定。 answer = sorted(fees.items(), key=lambda item: (-item[1], item[0])) # 手动拼接题目要求的无空格二维数组。 # 输出中的每个内层数组依次放房间号和总费用,元素之间只保留题目要求的逗号。 print("[" + ",".join(f"[{room},{fee}]" for room, fee in answer) + "]")JS
const fs = require("fs"); // 每三个整数依次还原为存件时间、取件时间和房间号。 // 同一房间可能出现多次,每处理一条记录就把本单费用加到该房间已有总费用上。 // 循环下标每次增加 3,因此第 i、i+1、i+2 个数字始终属于同一条快递记录。 const numbers = (fs.readFileSync(0, "utf8").match(/\d+/g) || []).map(Number); const fees = new Map(); for (let i = 0; i + 2 < numbers.length; i += 3) { const duration = numbers[i + 1] - numbers[i], room = numbers[i + 2]; // 12 小时内免费,超时部分按 12 小时向上取整。 // 例如存放 25 小时会超时 13 小时,(13+11)/12 的整数除法结果为 2 元。 const fee = duration <= 12 ? 0 : Math.ceil((duration - 12) / 12); fees.set(room, (fees.get(room) || 0) + fee); } // 费用降序优先,并列时房间号升序;JSON 输出紧凑格式。 // 输出中的每个内层数组依次放房间号和总费用,元素之间只保留题目要求的逗号。 // 比较器先看费用;只有费用相等时才比较房间号,避免并列结果顺序不确定。 const answer = [...fees].sort((a, b) => b[1] - a[1] || a[0] - b[0]); console.log(JSON.stringify(answer));【华为od机试真题Python+JS+Java+Go合集】【超值优惠】:Py/JS/Java/Go合集
【华为od机试真题Python】:Python真题题库
【华为od机试真题JavaScript】:JavaScript真题题库
【华为od机试真题Java&Go】:Java&Go真题题库
【华为od机试真题C++】:C++真题题库
【华为od机试真题C语言】:C语言真题题库
【华为od面试手撕代码题库】:面试手撕代码题库
【华为od机试面试交流群】【文章底部有二维码链接,可扫码加交流群】
华为OD机试:二本院校有机会吗? 有机会,但不大,大神除外!机考分数越高越好,所以需要提前刷题。机考通过后,如果没有收到面试邀请,也不要着急,非目标院校面试邀请发的时间比较晚。非目标院校今年有点难,机试至少要考到350分,所以需要疯狂刷题,华为OD机考是有题库的,最好在考前完所有题库题目。华为OD机试:跨专业可以参加华为OD可以,但是如果你的本科院校比较差,上岸概率不大。华为OD机试:华为OD简历被锁定机试通过,性格测试也通过,但是没人联系面试,发现简历被锁定。此时需要主动去联系HR。让他帮助你查询原因。