Python实现列表连续3元素求和及最大和查找(多规模列表)
问题需求
- 编写Python程序,处理包含1000个随机正整数的列表,计算所有连续3个元素的和并找出最大和
- 程序需要适配元素量为30000、1000000的列表
- 示例:测试列表
testlist = [1,2,3,4,5,6,7,8,9,10],需计算(1,2,3)、(2,3,4)、(3,4,5)等连续三元组的和,再找出其中的最大值
我的尝试代码
for i in [1,2,3]: with open(f"DANE/bloki{i}.txt", "r") as file: lines = file.readlines() lines_clear = [] for line in lines: lines_clear.append(int(line.strip())) # print(lines_clear) max_sum_of_block = 0 for start in range(len(lines_clear)): for end in range(start, len(lines_clear)): sum_of_block = sum(lines_clear[start:end]) max_sum_of_block = max(max_sum_of_block, sum_of_block) print(max_sum_of_block)
代码问题分析
- 逻辑偏离需求:当前代码计算的是所有长度的连续子数组和,而非要求的连续3个元素的和
- 性能严重不足:嵌套循环+每次调用
sum()的方式时间复杂度为O(n²),处理100万级元素会直接陷入长时间等待甚至卡死 - 文件读取错误:循环读取3个文件时,每次都会覆盖
lines_clear变量,最终仅保留最后一个文件的内容
正确解决方案
基础实现(针对连续三元组)
采用滑动窗口算法,时间复杂度O(n),处理任意规模数据都高效:
def max_consecutive_triple_sum(num_list): if len(num_list) < 3: return None # 元素数量不足3个时返回None # 初始化第一个三元组的和 current_sum = sum(num_list[:3]) max_sum = current_sum # 滑动窗口遍历后续元素 for i in range(3, len(num_list)): # 减去窗口最左侧元素,加上新进入窗口的元素 current_sum = current_sum - num_list[i-3] + num_list[i] if current_sum > max_sum: max_sum = current_sum return max_sum # 测试示例 testlist = [1,2,3,4,5,6,7,8,9,10] print(max_consecutive_triple_sum(testlist)) # 输出27,对应8+9+10的和
适配超大文件/数据量的版本
如果是从文件读取数据,避免一次性加载所有内容到内存,逐行处理:
def max_triple_sum_from_file(file_path): with open(file_path, 'r') as f: # 先读取前3个元素初始化窗口 window = [] for _ in range(3): line = f.readline() if not line: return None # 文件行数不足3行 window.append(int(line.strip())) max_sum = sum(window) current_sum = max_sum # 滑动窗口处理剩余行 for line in f: num = int(line.strip()) # 移除窗口最左元素,加入新元素 current_sum = current_sum - window.pop(0) + num window.append(num) if current_sum > max_sum: max_sum = current_sum return max_sum # 批量处理3个文件 for i in [1,2,3]: file_result = max_triple_sum_from_file(f"DANE/bloki{i}.txt") print(f"文件bloki{i}.txt的最大连续三元组和:{file_result}")
内容的提问来源于stack exchange,提问作者Mertes
相关产品推荐
相关产品推荐

