爱站网反链查询,柳州网站建设哪家好,做家教网站资质,做网站的工作轻松吗题目描述
运维工程师采集到某产品线网运行一天产生的日志n条#xff0c;现需根据日志时间先后顺序对日志进行排序#xff0c;日志时间格式为H:M:S.N。 • H表示小时(0~23) • M表示分钟(0~59) • S表示秒(0~59) • N表示毫秒(0~999) 时间可能并没有补全#xff0c;也就是说…题目描述
运维工程师采集到某产品线网运行一天产生的日志n条现需根据日志时间先后顺序对日志进行排序日志时间格式为H:M:S.N。 • H表示小时(0~23) • M表示分钟(0~59) • S表示秒(0~59) • N表示毫秒(0~999) 时间可能并没有补全也就是说01:01:01.001也可能表示为1:1:1.1。
输入描述 第一行输入一个整数n表示日志条数1n100000接下来n行输入n个时间。
输出描述 按时间升序排序之后的时间如果有两个时间表示的时间相同则保持输入顺序。
用例
输入 2 01:41:8.9 1:1:09.211 输出 1:1:09.211 01:41:8.9 说明无
输入 3 23:41:08.023 1:1:09.211 08:01:22.0 输出 1:1:09.211 08:01:22.0 23:41:08.023 说明无
输入 2 22:41:08.023 22:41:08.23 输出 22:41:08.023 22:41:08.23 说明两个时间表示的时间相同保持输入顺序
时间日志排序算法详解
核心解题思路
本题目要求对格式为H:M:S.N的时间日志进行排序其中时间可能没有补全如1:1:1.1表示01:01:01.100。解题的核心思路如下
时间格式解析将非标准化时间字符串分解为小时、分钟、秒和毫秒四个部分单位统一转换将所有时间单位转换为毫秒以便比较稳定排序在排序过程中对于时间相同的条目保持原始输入顺序结果输出输出原始时间字符串不改变其格式
关键点说明
补全规则对于毫秒部分如果位数不足3位需要在右侧补零如1→10001→010排序稳定性使用稳定排序算法确保时间相同时保持输入顺序高效处理采用O(n log n)的排序算法处理最多100,000条日志
完整代码实现
def main():n int(input().strip())times [input().strip() for _ in range(n)]# 存储(总毫秒数原始字符串)的元组parsed_times []for time_str in times:# 分割小时、分钟和秒/毫秒部分parts time_str.split(:)hour int(parts[0])minute int(parts[1])# 处理秒和毫秒if . in parts[2]:sec_str, ms_str parts[2].split(., 1) # 只分割一次sec int(sec_str)# 毫秒处理截取前3位并右侧补零ms_str ms_str[:3].ljust(3, 0)ms int(ms_str)else:sec int(parts[2])ms 0# 计算总毫秒数total_ms (hour * 3600 minute * 60 sec) * 1000 msparsed_times.append((total_ms, time_str))# 稳定排序时间相同的保持输入顺序parsed_times.sort(keylambda x: x[0])# 输出结果for _, time_str in parsed_times:print(time_str)if __name__ __main__:main()算法原理解析
1. 时间解析
parts time_str.split(:)
hour int(parts[0])
minute int(parts[1])使用冒号分割字符串获取小时和分钟直接转换为整数自动处理前导零
2. 秒和毫秒处理
if . in parts[2]:sec_str, ms_str parts[2].split(., 1)ms_str ms_str[:3].ljust(3, 0)ms int(ms_str)检查秒部分是否包含小数点表示有毫秒分割秒和毫秒部分关键操作毫秒字符串右侧补零至3位如9→90009→090转换为整数的毫秒值
3. 毫秒转换公式
total_ms (hour * 3600 minute * 60 sec) * 1000 ms1小时 3600秒 3,600,000毫秒1分钟 60秒 60,000毫秒1秒 1,000毫秒公式汇总(小时×3600 分钟×60 秒)×1000 毫秒
4. 稳定排序
parsed_times.sort(keylambda x: x[0])使用Python的TimSort稳定排序算法仅比较总毫秒数时间相同时保持原始顺序时间复杂度O(n log n)满足100,000条日志的处理需求
示例解析
示例1输入2\n01:41:8.9\n1:1:09.211 解析第一条01:41:8.9 小时1, 分钟41, 秒8, 毫秒9009→900总毫秒 (1×3600 41×60 8)×1000 900 6,068,900 解析第二条1:1:09.211 小时1, 分钟1, 秒9, 毫秒211总毫秒 (1×3600 1×60 9)×1000 211 3,669,211 排序结果3,669,211 6,068,900 → 先输出第二条 1:1:09.211
01:41:8.9示例2输入3\n23:41:08.023\n1:1:09.211\n08:01:22.0 解析 1:1:09.211 → 3,669,21108:01:22.0 → (8×3600 1×60 22)×1000 0 28,882,00023:41:08.023 → (23×3600 41×60 8)×1000 23 85,268,023 排序结果 1:1:09.211
08:01:22.0
23:41:08.023示例3输入2\n22:41:08.023\n22:41:08.23 解析 22:41:08.023 → 毫秒023 → 2322:41:08.23 → 毫秒23 → 230右侧补零总毫秒差23 230 排序结果时间相同保持顺序但实际23≠230 22:41:08.023
22:41:08.23总结与拓展
关键知识点
时间格式处理分割字符串和类型转换单位转换时间单位间的换算关系稳定排序保持相等元素的原始顺序边界处理毫秒补零规则
拓展思考
更复杂的时间格式如何支持年-月-日 时:分:秒.毫秒格式多时区处理如何对不同时区的时间进行排序性能优化对于超大数据集1,000,000条如何优化错误处理如何检测并处理非法时间格式
本解法通过以下步骤高效解决问题
解析非标准时间字符串统一转换为毫秒比较稳定排序保持原始顺序输出原始格式结果
初学者可从中学习
字符串分割和处理技巧时间单位换算方法稳定排序的实现和应用边界情况的处理策略 核心启示将复杂格式的数据转换为统一可比较的数值是解决排序问题的通用思路。