GeeksforGeeks编程问题求助:列表求和(含7及相邻元素排除规则)代码调试
解决数字列表总和计算问题(排除7及其相邻元素)
我来帮你搞定这个问题!先看看你的代码里存在的几个关键问题,再给你两种符合需求的正确解法。
你的代码存在的问题
- 未处理列表末尾的7:你的循环只遍历到
len(arr)-1的前一个元素(也就是range(len(arr)-1)),如果7在列表最后一位(比如[1,7]),这个7不会被检测到,导致它和左边的元素都被计入总和,结果错误。 - 未排除7的左侧相邻元素:需求是排除7及其左右相邻元素,但你的代码只减去了7和它的右侧元素,完全没处理左侧的相邻元素。比如
[1,7]这种情况,左侧的1应该被排除,但你的代码没有处理。 - 空列表的判断顺序冗余:你先计算了整个数组的和,再判断空列表,虽然结果没问题,但逻辑上没必要先计算空数组的和,大数组场景下会浪费性能。
正确解法1:记录所有需要排除的索引
这种方法先找出所有需要排除的元素索引,再计算剩余元素的和,逻辑清晰,能覆盖所有边界情况:
def calculate_sum(arr): # 处理空列表的情况 if not arr: return 0 exclude_indices = set() arr_length = len(arr) # 遍历数组,标记所有需要排除的索引 for idx in range(arr_length): if arr[idx] == 7: # 排除7本身 exclude_indices.add(idx) # 排除左侧相邻元素(如果存在) if idx > 0: exclude_indices.add(idx - 1) # 排除右侧相邻元素(如果存在) if idx < arr_length - 1: exclude_indices.add(idx + 1) # 计算剩余元素的总和 total = 0 for idx in range(arr_length): if idx not in exclude_indices: total += arr[idx] return total
测试示例
- 空列表:
calculate_sum([])→ 返回0,符合要求。 - 你的测试用例
[1, 3, 4, 4, 7, 7]:需要排除索引3、4、5,剩余元素是1、3、4,总和为8。 - 边界用例
[1,7]:排除索引0和1,总和为0。 - 边界用例
[7]:排除索引0,总和为0。 - 连续7的情况
[7,1,7]:排除所有索引,总和为0。
简化版解法(更高效)
如果想让代码更简洁高效,可以用一次遍历完成计算,不需要额外的集合存储空间:
def calculate_sum(arr): if not arr: return 0 total = 0 n = len(arr) for i in range(n): # 检查当前元素是否需要排除:是7,或是7的左右邻居 is_excluded = False if arr[i] == 7: is_excluded = True elif i > 0 and arr[i-1] == 7: is_excluded = True elif i < n-1 and arr[i+1] == 7: is_excluded = True if not is_excluded: total += arr[i] return total
这个方法直接在遍历过程中判断当前元素是否符合排除条件,逻辑同样清晰,执行效率也更高。
内容的提问来源于stack exchange,提问作者Puja Chattopadhyay
相关产品推荐
相关产品推荐

