欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 养生 > 华为OD机试 - 免单统计(Python/JS/C/C++ 2024 E卷 100分)

华为OD机试 - 免单统计(Python/JS/C/C++ 2024 E卷 100分)

2024/10/25 4:23:36 来源:https://blog.csdn.net/guorui_java/article/details/142283815  浏览:    关键词:华为OD机试 - 免单统计(Python/JS/C/C++ 2024 E卷 100分)

在这里插入图片描述

华为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、说明

前两个订单是同一秒内同一时刻下单,第三和第四个订单不是当前秒内最早下单,不可免单,第五个订单可以免单。

五、解题思路

  1. 解析输入:
    • 我们需要读取多行输入,每行是一个包含时间戳的字符串,表示顾客的下单时间。
    • 由于输入的格式保证合法,所以我们可以直接按要求解析这些时间戳。
  2. 按秒进行分组:
    • 我们只关注时间的秒和毫秒,因为顾客能免单的条件是“某一秒内最早下单的顾客”。
    • 将输入的时间戳按照“秒”进行分组,把相同秒内的订单放到同一个组中。
  3. 找到每秒内的最早订单:
    • 对于每个时间秒组,找到该秒内的最早下单的顾客(按毫秒进行比较),可能有多个订单同时满足最早条件。
  4. 统计结果:
    • 对每个秒组,统计最早的订单数量,累加到结果中。

六、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在线答疑。

在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com