劲舞团最长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]
- 劲舞团K连击最长长度计算:基于时间戳的连续正确操作滑动窗口分析(阿里通义 | 1439点数解答 | 2026-03-06 12:20:14)27
- 计算劲舞团游戏最长连击数的 Python 实现(字节豆包 | 522点数解答 | 2026-03-17 12:15:38)20
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)362
- 深度揭秘 Oracle Workarea Size Policy:参数调优助力数据库性能飞升(阿里通义 | 372点数解答 | 2024-05-13 10:54:45)244
- 51 单片机:定时器 0 实现 8 个 LED 循环点亮,附代码及优化建议(字节豆包 | 1193点数解答 | 2024-12-27 15:10:29)333
- 解析React 15与Vue 2:从O(n^3)到O(n),Diff算法时间复杂度计算及性能对比 (阿里通义 | 379点数解答 | 2023-11-09 01:49:19)344
- 缜密逻辑,全新无名杀“风餐”技能代码精心打造与深度解析 (字节豆包 | 469点数解答 | 2025-04-05 11:37:06)256
- 精准优化:明确需求,开启高效提升之旅! (字节豆包 | 52点数解答 | 2026-02-09 16:44:46)51
- 代码再升级:优化版“获取dump”代码,多机制保障数据读取与保存(字节豆包 | 734点数解答 | 2026-02-10 01:23:31)74
- 代码深度优化:全面检查异常、灵活读取内存,提升可读性与可维护性(字节豆包 | 959点数解答 | 2026-02-10 01:24:14)44
- Python切片操作巧解经典算法:二维数组90°旋转(阿里通义 | 205点数解答 | 2023-10-31 11:05:29)344
- 揭秘iOS开发:常用算法大集合,提升应用性能与体验!(阿里通义 | 246点数解答 | 2023-11-08 00:43:08)297