欢迎您访问新疆栾骏商贸有限公司,公司主营电子五金轴承产品批发业务!
全国咨询热线: 400-8878-609

新闻资讯

技术学院

如何在列表求和中智能跳过6与9之间的所有数字(包括双向区间)

作者:心靈之曲2025-12-25 00:00:00

本文介绍一种改进的列表求和算法:当遇到数字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边界的求和场景。