华为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算法源码
def main():import sysinput = 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:sssecond_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算法源码
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:ssconst secondTime = fullTime.substring(0, 19);// 将订单按秒放入Mapif (!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 30typedef 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 entrystrcpy(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:sschar 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:ssstring secondTime = fullTime.substr(0, 19);// 将订单按秒放入MaptimeMap[secondTime].push_back(fullTime);}
🏆下一篇:华为OD机试真题 - 简易内存池(Python/JS/C/C++ 2024 E卷 200分)
🏆本文收录于,华为OD机试真题(Python/JS/C/C++)
刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。