如何统计列表中连续三次H/T的streak次数?代码异常排查
问题分析与代码修正
你的代码存在两个核心逻辑错误:
- 出现H时未重置T的连续计数,反之亦然,导致不同字符的连续计数互相干扰
- 连续计数达到3后直接重置为0,无法正确处理连续超过3次的情况(无论是统计独立段还是重叠次数)
错误示例验证
以你给出的输出序列为例:
['T', 'T', 'T', 'H', 'T', 'H', 'H', 'T', 'T', 'T', 'T', 'H', 'T', 'T', 'H', 'T', 'T', 'T', 'T', 'H']
原代码输出6,但实际正确结果:按重叠次数统计应为5次,按独立段数统计应为3次(三段连续T的长序列:TTT、TTTT、TTTT)。
修正方案
方案1:统计所有连续三次的出现次数(含重叠)
比如TTTT会被统计为2次(第1-3个T、第2-4个T)
import random numberOfStreaks = 0 flip = [] current_streak = 1 # 当前连续次数,初始为1(第一个元素) prev_char = None for experimentNumber in range(20): # 生成随机结果 if random.randint(0, 1) == 0: current_char = 'H' else: current_char = 'T' flip.append(current_char) # 处理连续计数 if prev_char is not None: if current_char == prev_char: current_streak += 1 # 每达到或超过3次时,每多一个相同字符就多一次计数(处理重叠) if current_streak >= 3: numberOfStreaks += 1 else: current_streak = 1 # 切换字符,重置连续计数 prev_char = current_char print(flip) print(numberOfStreaks)
方案2:统计连续三次及以上的独立段数
比如TTTT只算1段,连续相同字符的长序列只计数一次
import random numberOfStreaks = 0 flip = [] current_streak = 1 prev_char = None streak_recorded = False # 标记当前段是否已计数 for experimentNumber in range(20): if random.randint(0, 1) == 0: current_char = 'H' else: current_char = 'T' flip.append(current_char) if prev_char is not None: if current_char == prev_char: current_streak += 1 # 当连续次数达到3且未标记时,计数一次并标记 if current_streak >= 3 and not streak_recorded: numberOfStreaks += 1 streak_recorded = True else: current_streak = 1 streak_recorded = False # 切换字符,重置标记 prev_char = current_char print(flip) print(numberOfStreaks)
原代码错误详解
- 未重置对立字符的计数:当序列从T切换到H时,
tStreak没有被清零,若后续再出现T,会继续累加之前的tStreak数值,导致错误计数。 - 重置计数过于激进:当连续次数达到3时直接重置为0,导致连续4次及以上的序列无法被正确统计(无论是重叠次数还是独立段数)。
内容的提问来源于stack exchange,提问作者Big_Port
相关产品推荐
相关产品推荐

