华为OD机试 2024E卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试真题(Python/JS/C/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 中,前两个订单是同一秒内同一时刻(也是最早)下单,都可免单,第三个订单是当前秒内唯一一个订单(也是最早),也可免单。
测试用例3:
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、说明
前两个订单是同一秒内同一时刻下单,第三和第四个订单不是当前秒内最早下单,不可免单,第五个订单可以免单。
五、解题思路
- 解析输入:
- 我们需要读取多行输入,每行是一个包含时间戳的字符串,表示顾客的下单时间。
- 由于输入的格式保证合法,所以我们可以直接按要求解析这些时间戳。
- 按秒进行分组:
- 我们只关注时间的秒和毫秒,因为顾客能免单的条件是“某一秒内最早下单的顾客”。
- 将输入的时间戳按照“秒”进行分组,把相同秒内的订单放到同一个组中。
- 找到每秒内的最早订单:
- 对于每个时间秒组,找到该秒内的最早下单的顾客(按毫秒进行比较),可能有多个订单同时满足最早条件。
- 统计结果:
- 对每个秒组,统计最早的订单数量,累加到结果中。
六、Python算法源码
python">def main():
import sys
input = sys.stdin.read
# 读取输入
data = input().splitlines()
n = int(data[0])
time_map = {}
# 读取所有的下单时间
for i in range(1, n + 1):
full_time = data[i]
# 获取秒级时间 yyyy-MM-dd HH:mm:ss
second_time = full_time[:19]
# 将订单按秒放入字典
if second_time not in time_map:
time_map[second_time] = []
time_map[second_time].append(full_time)
free_count = 0
# 遍历每个秒级时间
for second_time, orders in time_map.items():
earliest_order = None
# 找到该秒内最早的订单
for order in orders:
if earliest_order is None or order < earliest_order:
earliest_order = order
# 统计最早订单的数量
for order in orders:
if order == earliest_order:
free_count += 1
# 输出结果
print(free_count)
if __name__ == "__main__":
main()
七、JavaScript算法源码
javascript">function main() {
const fs = require('fs');
// 读取输入
const input = fs.readFileSync('/dev/stdin', 'utf8').split('\n');
const n = parseInt(input[0]);
const timeMap = new Map();
// 读取所有的下单时间
for (let i = 1; i <= n; i++) {
const fullTime = input[i].trim();
if (fullTime === '') continue;
// 获取秒级时间 yyyy-MM-dd HH:mm:ss
const secondTime = fullTime.substring(0, 19);
// 将订单按秒放入Map
if (!timeMap.has(secondTime)) {
timeMap.set(secondTime, []);
}
timeMap.get(secondTime).push(fullTime);
}
let freeCount = 0;
// 遍历每个秒级时间
for (let [secondTime, orders] of timeMap.entries()) {
let earliestOrder = null;
// 找到该秒内最早的订单
for (let order of orders) {
if (earliestOrder === null || order < earliestOrder) {
earliestOrder = order;
}
}
// 统计最早订单的数量
for (let order of orders) {
if (order === earliestOrder) {
freeCount++;
}
}
}
// 输出结果
console.log(freeCount);
}
main();
八、C算法源码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_N 50000
#define MAX_LEN 30
typedef struct OrderNode {
char fullTime[MAX_LEN];
struct OrderNode* next;
} OrderNode;
typedef struct {
char secondTime[MAX_LEN];
OrderNode* orders;
} TimeMapEntry;
TimeMapEntry timeMap[MAX_N];
int timeMapSize = 0;
// Helper function to find or create a time map entry
OrderNode* findOrCreateTimeMapEntry(const char* secondTime) {
for (int i = 0; i < timeMapSize; i++) {
if (strcmp(timeMap[i].secondTime, secondTime) == 0) {
return timeMap[i].orders;
}
}
// Create a new entry
strcpy(timeMap[timeMapSize].secondTime, secondTime);
timeMap[timeMapSize].orders = NULL;
return timeMap[timeMapSize++].orders;
}
int main() {
int n;
scanf("%d", &n);
// 读取所有的下单时间
for (int i = 0; i < n; i++) {
char fullTime[MAX_LEN];
scanf("%s", fullTime);
// 获取秒级时间 yyyy-MM-dd HH:mm:ss
char secondTime[MAX_LEN];
strncpy(secondTime, fullTime, 19);
secondTime[19] = '\0';
// 将订单按秒放入数组
OrderNode* node = malloc(sizeof(OrderNode));
strcpy(node->fullTime, fullTime);
node->next = NULL;
OrderNode* orderList = findOrCreateTimeMapEntry(secondTime);
if (orderList == NULL) {
timeMap[timeMapSize - 1].orders = node;
} else {
OrderNode* current = timeMap[timeMapSize - 1].orders;
while (current->next != NULL) {
current = current->next;
}
current->next = node;
}
}
int freeCount = 0;
// 遍历每个秒级时间
for (int i = 0; i < timeMapSize; i++) {
OrderNode* orders = timeMap[i].orders;
九、C++算法源码
#include <iostream>
#include <map>
#include <vector>
#include <string>
using namespace std;
int main() {
int n;
cin >> n;
cin.ignore(); // 忽略换行符
map<string, vector<string>> timeMap;
// 读取所有的下单时间
for (int i = 0; i < n; i++) {
string fullTime;
getline(cin, fullTime);
// 获取秒级时间 yyyy-MM-dd HH:mm:ss
string secondTime = fullTime.substr(0, 19);
// 将订单按秒放入Map
timeMap[secondTime].push_back(fullTime);
}
🏆下一篇:华为OD机试真题 - 简易内存池(Python/JS/C/C++ 2024 E卷 200分)
🏆本文收录于,华为OD机试真题(Python/JS/C/C++)
刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。