【2024华为OD-E卷-100分-日志排序】((题目+思路+Java&C++&Python解析)

题目

日志排序

给定一个包含日志记录的字符串数组 logs,每个日志记录由时间戳(24小时制)、设备ID和日志内容组成,格式如下:

"{时间戳} {设备ID} {日志内容}"

例如:

"2023-10-01 12:00:01 1 device_start"
"2023-10-01 12:00:02 2 device_error"

要求:

  1. 将日志记录按时间戳从早到晚排序。
  2. 如果时间戳相同,则按设备ID从小到大排序。
  3. 如果时间戳和设备ID都相同,则按日志内容字典序从小到大排序。

输入

  • 一个字符串数组 logs,每个字符串表示一条日志记录。

输出

  • 排序后的字符串数组 logs。

示例 : 输入:

"2023-10-01 12:00:01 1 device_start", "2023-10-01 12:00:02 2 device_error", "2023-10-01 12:00:01 1 device_stop"

输出:

"2023-10-01 12:00:01 1 device_start", "2023-10-01 12:00:01 1 device_stop", "2023-10-01 12:00:02 2 device_error"

思路

  1. 解析日志记录 :将每条日志记录拆分成时间戳、设备ID和日志内容。
  2. 自定义排序 :使用自定义排序规则,先按时间戳排序,如果时间戳相同则按设备ID排序,如果设备ID也相同则按日志内容排序。
  3. 输出结果 :将排序后的日志记录重新组合成字符串数组。

Java 编码解析

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Date;

public class LogSorter {
public static String[] sortLogs(String[] logs) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

Arrays.sort(logs, new Comparator<String>() {
@Override
public int compare(String log1, String log2) {
String[] parts1 = log1.split(" ");
String[] parts2 = log2.split(" ");

try {
Date date1 = sdf.parse(parts1[0]);
Date date2 = sdf.parse(parts2[0]);

int timestampCompare = date1.compareTo(date2);
if (timestampCompare != 0) {
return timestampCompare;
}

int deviceIdCompare = Integer.parseInt(parts1[1]) - Integer.parseInt(parts2[1]);
if (deviceIdCompare != 0) {
return deviceIdCompare;
}

return parts1[2].compareTo(parts2[2]);
} catch (ParseException e) {
throw new RuntimeException("Invalid log format", e);
}
}
});

return logs;
}

public static void main(String[] args) {
String[] logs = {
"2023-10-01 12:00:01 1 device_start",
"2023-10-01 12:00:02 2 device_error",
"2023-10-01 12:00:01 1 device_stop"
};

String[] sortedLogs = sortLogs(logs);

for (String log : sortedLogs) {
System.out.println(log);
}
}
}

C++ 编码解析

#include <iostream>
#include <vector>
#include <sstream>
#include <algorithm>
#include <iomanip>

bool compareLogs(const std::string& log1, const std::string& log2) {
std::istringstream ss1(log1), ss2(log2);
std::string timestamp1, deviceId1, content1, timestamp2, deviceId2, content2;

ss1 >> timestamp1 >> deviceId1 >> content1;
ss2 >> timestamp2 >> deviceId2 >> content2;

struct tm tm1 = {}, tm2 = {};
std::istringstream(timestamp1) >> std::get_time(&tm1, "%Y-%m-%d %H:%M:%S");
std::istringstream(timestamp2) >> std::get_time(&tm2, "%Y-%m-%d %H:%M:%S");

std::time_t time1 = std::mktime(&tm1);
std::time_t time2 = std::mktime(&tm2);

if (time1 != time2) {
return time1 < time2;
}

int devId1 = std::stoi(deviceId1);
int devId2 = std::stoi(deviceId2);

if (devId1 != devId2) {
return devId1 < devId2;
}

return content1 < content2;
}

std::vector<std::string> sortLogs(const std::vector<std::string>& logs) {
std::vector<std::string> sortedLogs = logs;
std::sort(sortedLogs.begin(), sortedLogs.end(), compareLogs);
return sortedLogs;
}

int main() {
std::vector<std::string> logs = {
"2023-10-01 12:00:01 1 device_start",
"2023-10-01 12:00:02 2 device_error",
"2023-10-01 12:00:01 1 device_stop"
};

std::vector<std::string> sortedLogs = sortLogs(logs);

for (const auto& log : sortedLogs) {
std::cout << log << std::endl;
}

return 0;
}

Python 编码解析

from datetime import datetime

def sort_logs(logs):
def parse_log(log):
timestamp, device_id, content = log.split()
return datetime.strptime(timestamp, "%Y-%m-%d %H:%M:%S"), int(device_id), content

logs.sort(key=lambda log: parse_log(log))
return logs

logs = [
"2023-10-01 12:00:01 1 device_start",
"2023-10-01 12:00:02 2 device_error",
"2023-10-01 12:00:01 1 device_stop"
]

sorted_logs = sort_logs(logs)

for log in sorted_logs:
print(log)

相关推荐
一水鉴天1 分钟前
整体设计 逻辑系统程序 之34七层网络的中台架构设计及链路对应讨论(含 CFR 规则与理 / 事代理界定)
人工智能·算法·公共逻辑
DuHz4 分钟前
C程序中的数组与指针共生关系
linux·c语言·开发语言·嵌入式硬件·算法
而后笑面对5 分钟前
力扣2025.10.19每日一题
算法·leetcode·职场和发展
·白小白23 分钟前
力扣(LeetCode) ——11.盛水最多的容器(C++)
c++·算法·leetcode
沐浴露z2 小时前
【JVM】详解 垃圾回收
java·jvm·算法
代码欢乐豆2 小时前
编译原理机测客观题(7)优化和代码生成练习题
数据结构·算法·编译原理
祁同伟.3 小时前
【C++】二叉搜索树(图码详解)
开发语言·数据结构·c++·容器·stl
喵手3 小时前
【参赛心得】从“碰一碰”到“服务流转”:HarmonyOS创新赛金奖作品“智游文博”全流程复盘!
华为·harmonyos·鸿蒙应用开发·1024征文
Scc_hy3 小时前
强化学习_Paper_2000_Eligibility Traces for Off-Policy Policy Evaluation
人工智能·深度学习·算法·强化学习·rl
安卓开发者3 小时前
鸿蒙NEXT Wear Engine开发实战:手机侧应用如何调用穿戴设备能力
华为·智能手机·harmonyos