You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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秒

现有代码问题分析

你提供的代码核心逻辑是通过标记数组记录可通行节点,但存在两处明显效率瓶颈:

  1. 处理每个日志条目时,需遍历26个字母定位区间起点和终点,重复操作冗余;
  2. 标记路径依赖flag变量逐位判断,逻辑繁琐且执行效率低。
优化方案

我们可以利用区间合并思路简化逻辑,结合Python内置函数大幅提升效率:

  1. 将每个日志条目转换为字母对应的ASCII码区间(比如BG排序后对应B(66)到G(71)的区间[66,71]);
  2. 合并所有重叠或相邻的区间,得到最终的连续可通行区间集合;
  3. 计算每个合并后区间的边数(边数=区间内点数-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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 09:55:31