华为OD机试 2024E卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试(JAVA)真题(E卷+D卷+A卷+B卷+C卷)》。
刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。
一、题目描述
华为商城举行了一个促销活动,如果某顾客是某一秒内最早下单的顾客(可能是多个人),则可以获取免单。
请你编程计算有多少顾客可以获取免单。
二、输入描述
输入为n行数据,每一行表示一位顾客的下单时间
以(年-月-日时-分-秒.毫秒)yyyy-MM-ddHH:mm.fff 形式给出。
0 < n < 50000
2000 < yyyy < 2020
0 < MM <= 12
0 < dd <= 28
0 <= HH <= 23
0 <= mm <= 59
0 <= ss <= 59
0 <= fff <= 999
所有输入保证合法。
三、输出描述
输出一个整数,表示有多少顾客可以获取免单。
四、测试用例
测试用例1:
1、输入
3
2019-01-01 00:00:00.001
2019-01-01 00:00:00.002
2019-01-01 00:00:00.003
2、输出
1
3、说明
样例 1 中,三个订单都是同一秒内下单,只有第一个订单最早下单,可以免单。
测试用例2:
1、输入
3
2019-01-01 08:59:00.123
2019-01-01 08:59:00.123
2018-12-28 10:08:00.999
2、输出
3
3、说明
样例 2 中,前两个订单是同一秒内同一时刻(也是最早)下单,都可免单,第三个订单是当前秒内唯一一个订单(也是最早),也可免单。
五、解题思路
- 解析输入:
- 我们需要读取多行输入,每行是一个包含时间戳的字符串,表示顾客的下单时间。
- 由于输入的格式保证合法,所以我们可以直接按要求解析这些时间戳。
- 按秒进行分组:
- 我们只关注时间的秒和毫秒,因为顾客能免单的条件是“某一秒内最早下单的顾客”。
- 将输入的时间戳按照“秒”进行分组,把相同秒内的订单放到同一个组中。
- 找到每秒内的最早订单:
- 对于每个时间秒组,找到该秒内的最早下单的顾客(按毫秒进行比较),可能有多个订单同时满足最早条件。
- 统计结果:
- 对每个秒组,统计最早的订单数量,累加到结果中。
六、Java算法源码
public class OdTest01 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = Integer.parseInt(scanner.nextLine());
Map<String, List<String>> timeMap = new HashMap<>();
// 读取所有的下单时间
for (int i = 0; i < n; i++) {
String fullTime = scanner.nextLine();
// 获取秒级时间 yyyy-MM-dd HH:mm:ss
String secondTime = fullTime.substring(0, 19);
// 将订单按秒放入Map
timeMap.putIfAbsent(secondTime, new ArrayList<>());
timeMap.get(secondTime).add(fullTime);
}
scanner.close();
int freeCount = 0;
// 遍历每个秒级时间
for (Map.Entry<String, List<String>> entry : timeMap.entrySet()) {
List<String> orders = entry.getValue();
String earliestOrder = null;
// 找到该秒内最早的订单
for (String order : orders) {
if (earliestOrder == null || order.compareTo(earliestOrder) < 0) {
earliestOrder = order;
}
}
// 统计最早订单的数量
for (String order : orders) {
if (order.equals(earliestOrder)) {
freeCount++;
}
}
}
// 输出结果
System.out.println(freeCount);
}
}
七、效果展示
1、输入
5
2019-01-01 00:00:00.004
2019-01-01 00:00:00.004
2019-01-01 00:00:01.006
2019-01-01 00:00:01.006
2019-01-01 00:00:01.005
2、输出
3
3、说明
前两个订单是同一秒内同一时刻下单,第三和第四个订单不是当前秒内最早下单,不可免单,第五个订单可以免单。
🏆下一篇:华为OD机试 - 简易内存池 - 逻辑分析(Java 2024 E卷 200分)
🏆本文收录于,华为OD机试(JAVA)真题(E卷+D卷+A卷+B卷+C卷)
刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。