
本文介绍一种改进的列表求和算法:当遇到数字6或9时,将两者之间(含6和9)的所有数字排除;若连续出现同类型边界(如6…6或9…9),中间数字仍需计入总和;支持6→9和9→6两种方向的区间识别。
在常规“跳过6到9之间数字”的问题中,通常只处理 6 → ... → 9 单向区间(如经典 sum6 函数)。但本题引入关键 twist:9 → ... → 6 同样构成排除区间,且需保证 6→6 或 9→9 之间的数字不被排除——即仅当6与9(或9与6)成对出现、且中间无同类型中断时,才触发排除逻辑。
为精准建模该行为,核心思路是:
- 使用两个布尔标志 saw6 和 saw9 记录最近一次遇到的是6还是9;
- 维护一个临时累加器 temp,持续累加当前“有效段”内的数字;
- 每次遇到6或9时,根据历史状态决定是否将 temp 累加进最终结果,并重置 temp;
- 关键判断逻辑在于:仅当新边界与上一个边界类型不同(即形成6↔9配对),或这是首次遇到边界时,才提交当前段的和;若连续遇到相同边界(如6后又遇6),说明前一段应保留,故立即将 temp 加入总和,再清空。
以下是完整可运行的实现:
def twistersum(nums):
the_sum = 0
temp = 0
saw6 = saw9 = False
for i in nums:
if i == 6:
# 若刚见过6(saw6=True),或尚未见过任何边界(saw6=saw9=False),
# 说明当前6开启新段,应提交上一段(temp)并重置
if saw6 or (not saw6 and not saw9):
the_sum += temp
temp = 0
saw6 = True
saw9 = False
elif i == 9:
# 同理:若刚见过9,或首次见边界,则提交temp
if saw9 or (not saw6 and not saw9):
the_sum += temp
temp = 0
saw6 = False
saw9 = True
else:
temp += i
# 循环结束后,追加最后一段未提交的数字
the_sum += temp
return the_sum
# 测试用例
list1 = [1,2,3,4,6,7,3,5,9,7,2,4,9,4,5,6,7,8,9,4,3,2,1]
print(twistersum(list1)) # 输出: 33执行过程简析(以 list1 为例):
- [1,2,3,4] → temp=10
- 遇 6:首次边界,提交 temp=10,the_sum=10,重置 temp=0,saw6=True
- [7,3,5] → temp=15
- 遇 9:与上一 6 配对,不提交,清空 temp=0,saw9=True
- [7,2,4] → temp=13
- 遇 9:连续 9,触发提交 → the_sum = 10 + 13 = 23,重置 temp=0,saw9=True
- [4,5] → temp=9
- 遇 6:9→6 配对,不提交,清空 temp=0,saw6=True
- [7,8] → temp=15
- 遇 9:6→9 配对,不提交,清空 temp=0
- [4,3,2,1] → temp=10
- 结尾追加:the_sum = 23 + 10 = 33
✅ 注意事项:
- 该算法严格按顺序扫描,时间复杂度 O(n),空间复杂度 O(1);
- 不依赖额外数据结构(如栈),避免嵌套区间歧义;
- 若列表以6或9结尾,其后无配对边界,则末尾数字不会被遗漏(因最后 the_sum += temp 保障);
- 所有非6/9数字均被无条件计入 temp,逻辑清晰无歧义。
此方案兼顾鲁棒性与可读性,适用于各类含多组交错6/9边界的求和场景。










