Python循环性能优化求助:卡车路线可达性代码超时优化
问题描述
暴雨淹没部分公路后,卡车调度员需确定仍可通行的路线。卡车必须在标记为A到Z的26个途经点间沿线性有序路径行驶(正序或逆序字母顺序均可)。
调度员仅可使用记录近期成功行程的日志本:日志本为字符串列表,每个字符串对应一条记录,包含两个字符分别代表行程起点和终点。若日志中有两点间的成功行程记录,则两点间所有途经点均可通行,且双向有效(如记录RP表示R→Q→P和P→Q→R均可行)。
给定日志条目数组,需编写函数返回最长连续通行路线的长度(即已知安全的连续边的最大数量)。
示例
当logbook = ["BG", "CA", "FI", "OK"]时,输出应为solution(logbook) = 8。
原因:A到C、B到G均可行,因此A到G可通行;F到I可行且可从G到达I,故A→I可通行,该路线包含9个途经点,对应8条边;O到K为4条边的路线,两条路径不相交,故最长为8。
要求
运行时间需小于4秒
现有代码问题分析
你提供的代码核心逻辑是通过标记数组记录可通行节点,但存在两处明显效率瓶颈:
- 处理每个日志条目时,需遍历26个字母定位区间起点和终点,重复操作冗余;
- 标记路径依赖
flag变量逐位判断,逻辑繁琐且执行效率低。
优化方案
我们可以利用区间合并思路简化逻辑,结合Python内置函数大幅提升效率:
- 将每个日志条目转换为字母对应的ASCII码区间(比如
BG排序后对应B(66)到G(71)的区间[66,71]); - 合并所有重叠或相邻的区间,得到最终的连续可通行区间集合;
- 计算每个合并后区间的边数(边数=区间内点数-1,即
end - start),取最大值。
优化后代码
def solution(logbook): # 将每个日志条目转换为有序的ASCII码区间 intervals = [] for entry in logbook: # 用ord()直接获取字母的ASCII码,sorted()自动按字母顺序排序 start, end = sorted(ord(c) for c in entry) intervals.append((start, end)) # 处理空日志的特殊情况 if not intervals: return 0 # 合并区间:先按起点排序,再遍历合并重叠/相邻区间 intervals.sort() merged = [intervals[0]] for current_start, current_end in intervals[1:]: last_start, last_end = merged[-1] if current_start <= last_end + 1: # 重叠或相邻,合并为更大的区间 merged[-1] = (last_start, max(last_end, current_end)) else: merged.append((current_start, current_end)) # 计算最长边数:每个区间的边数为(end - start) max_edges = max(end - start for start, end in merged) return max_edges
优化点说明
- 用
ord()替代字符串列表遍历,直接获取字母的数值位置,避免冗余循环; - 区间合并逻辑比逐位标记更高效,时间复杂度从O(n*26)降为O(n log n)(主要来自排序),大规模日志条目下提升明显;
- 利用Python内置的
sorted()、max()等函数简化逻辑,减少手动循环的出错概率。
内容的提问来源于stack exchange,提问作者Zenvega
相关产品推荐
相关产品推荐

