Python字符串首尾极值程序优化:如何将耗时降至1000ms以内?
优化方案:从末尾比较字符串的高效实现
核心优化思路
原代码的主要性能瓶颈在于存储所有输入字符串并二次遍历反转,当输入量较大时会产生显著的内存与时间开销。优化方向聚焦在「边读边处理,不缓存全量数据」和「降低IO调用次数」。
优化后的代码(边读边维护最值)
import sys # 处理停止字符串,保持与后续strip逻辑一致 stop = input().strip() # 初始化最小/最大值为停止字符串的反转及原串 min_rev = stop[::-1] min_str = stop max_rev = stop[::-1] max_str = stop # 逐行读取输入,减少IO调用开销 for line in sys.stdin: line = line.rstrip('\n') # 仅去除换行符,保留原字符串首尾空白 stripped_line = line.strip() if stripped_line == stop: break # 计算当前字符串的反转 curr_rev = line[::-1] # 更新最小值 if curr_rev < min_rev: min_rev = curr_rev min_str = line # 更新最大值 if curr_rev > max_rev: max_rev = curr_rev max_str = line print(min_str) print(max_str)
极致优化版本(批量读取全量输入)
针对超大量输入场景,一次性读取所有输入能进一步降低IO开销:
import sys def main(): # 一次性读取所有输入并按行拆分 all_lines = sys.stdin.read().splitlines() stop = all_lines[0].strip() min_rev = all_lines[0][::-1] min_str = all_lines[0] max_rev = all_lines[0][::-1] max_str = all_lines[0] for line in all_lines[1:]: stripped_line = line.strip() if stripped_line == stop: break curr_rev = line[::-1] if curr_rev < min_rev: min_rev = curr_rev min_str = line if curr_rev > max_rev: max_rev = curr_rev max_str = line print(min_str) print(max_str) if __name__ == "__main__": main()
关键优化点说明
- 内存优化:不再创建存储所有输入的列表,仅维护当前最小/最大反转字符串及对应原串,避免大内存占用。
- IO优化:使用
sys.stdin迭代或一次性读取,替代多次input()调用,减少系统IO的开销(这是竞赛场景下输入量较大时的核心提速点)。 - 减少冗余操作:边读取边实时更新最值,无需先收集全量数据再二次遍历反转,减少一次完整的列表遍历与字符串反转操作。
原代码潜在问题修正
原代码中stop未做strip()处理,但后续用line.strip() == stop判断终止,会导致停止字符串首尾有空白时逻辑不一致(比如输入09作为停止符,后续输入09不会触发终止)。优化后的代码统一对stop做strip(),保持逻辑一致性。
内容的提问来源于stack exchange,提问作者Anton
相关产品推荐
相关产品推荐

