酷代码 AI
菜单
服务商
DeepSeek字节豆包讯飞星火
更多选项

劲舞团最长K连击算法实现与鲁棒性优化详解

你提到“上体运行错误”,推测是之前 Python 代码在实际运行时出现异常(如 `FileNotFoundError`、`IndexError`、`ValueError`,或未按预期读取文件),或者逻辑有误(比如**没有对原始日志按时间戳排序,导致连击判断错误**)。 我们来 **彻底重写一个健壮、清晰、可直接运行的版本**,并重点修复以下常见坑点: ✅ **关键修复点:** 1. **必须先按时间戳对所有日志行排序**(题目未保证输入顺序!); 2. 正确解析每行(支持空格/制表符分隔,跳过非法行); 3. 严格只统计「正确敲击」且「时间连续满足 ≤1000ms 间隔」的最长段; 4. 边界处理完善(0 条记录、全错、单条正确等); 5. 加入详细注释和错误提示(方便调试)。 --- ### ✅ 重写版 Python 脚本(稳健、可直接运行) ```python #!/usr/bin/env python3 # -*- coding: utf-8 -*- def main(): # === 1. 读取并解析 log.txt === logs = [] try: with open("log.txt", "r", encoding="utf-8") as f: for line_num, line in enumerate(f, start=1): line = line.strip() if not line: continue parts = line.split() # 按空白符分割(兼容空格/制表符) if len(parts) < 3: print(f"⚠️ 警告:第 {line_num} 行格式错误(字段数 < 3),已跳过:{repr(line)}") continue correct, actual, ts_str = parts[0], parts[1], parts[2] try: ts = int(ts_str) logs.append((ts, correct, actual)) except ValueError: print(f"⚠️ 警告:第 {line_num} 行时间戳非整数,已跳过:{repr(line)}") continue except FileNotFoundError: print("❌ 错误:找不到文件 'log.txt',请确保它在当前目录下。") return except Exception as e: print(f"❌ 读取文件时发生未知错误:{e}") return # === 2. 按时间戳升序排序(至关重要!)=== if not logs: print(0) return logs.sort(key=lambda x: x[0]) # 按 ts 升序 # === 3. 提取所有「正确敲击」的时间戳(已按时间有序)=== valid_ts = [] for ts, correct, actual in logs: if correct == actual: valid_ts.append(ts) # === 4. 滑动窗口找最长连续连击段(相邻间隔 ≤ 1000ms)=== if not valid_ts: print(0) return max_k = 1 # 至少单次敲击算 1 连击 left = 0 # 从第 1 个有效敲击(索引 1)开始遍历 for right in range(1, len(valid_ts)): gap = valid_ts[right] - valid_ts[right - 1] if gap <= 1000: # 可延续连击 current_k = right - left + 1 if current_k > max_k: max_k = current_k else: # 断连!新连击从 right 开始 left = right print(max_k) if __name__ == "__main__": main() ``` --- ### ✅ 为什么这个版本更可靠? | 问题 | 修复方式 | |------|----------| | ❌ 文件不存在 | `try-except FileNotFoundError` 友好提示 | | ❌ 行格式错误(缺字段/时间非数字) | 跳过并打印警告行号和内容,不崩溃 | | ❌ 未排序导致连击误判 | 显式 `logs.sort(key=lambda x: x[0])` | | ❌ 把“首尾时间差”当连击条件 | 严格检查**每一对相邻** `valid_ts[i] - valid_ts[i-1] ≤ 1000` | | ❌ 单条正确敲击输出 0 | 初始化 `max_k = 1`,且 `valid_ts` 非空时必 ≥1 | | ❌ 中文路径/编码问题 | 显式 `encoding="utf-8"` | --- ### 🧪 测试样例(可保存为 `log.txt` 验证) ``` A A 100 D D 1200 S F 2000 D D 2100 D D 3050 D D 4000 F F 5001 ``` ✅ 解析后 `valid_ts = [100, 1200, 2100, 3050, 4000, 5001]` → 间隔:`1100`(×), `900`(✓), `950`(✓), `950`(✓), `1001`(×) → 连续段:`[1200,2100,3050,4000]` → 长度 = **4** ✅ 输出:`4` --- ### 💡 小贴士(提交/调试用) - 在命令行运行:`python solve.py` - 若用在线 OJ,可能需从 `sys.stdin` 读(但题干明确说“log.txt”,所以本地文件读取是正确方式); - 如需适配 stdin(例如重定向 `python solve.py < log.txt`),可替换文件读取部分为: ```python import sys lines = sys.stdin.read().strip().splitlines() ``` (需要我帮你加这个 stdin 版本?欢迎提出 👍) --- ######[AI写代码神器 | 1411点数解答 | 2026-03-06 12:23:44]

相关提问
本站限时免费提问中
实用工具查看更多
Linux在线手册 [开发类]
Jquery在线手册 [开发类]
今日油价 [生活类]
图片互转base64 [开发类]
时间转换器 [开发类]