for循环中实现数组索引按+5(或指定步长)跳转的方法(连续相同数字统计场景)
连续5个相同数字的组数统计实现方案
核心问题
原有固定步长的for循环在检测到连续5个相同数字后,无法自动跳过已统计的元素,会以串内每个位置为起点重复检测同一段连续值,导致长串同值被重复计数。比如9个连续的8,原逻辑会依次从第1、2、3、4、5个8开始检测到符合条件的5连值,重复计5次,和预期的“每5个连续值计1组,9个连续值仅计2组”的规则不符。
目标逻辑规则
- 以数组当前指针位置的数值为基准,向后检查连续4个元素是否和基准值完全一致
- 若凑够5个连续相同值,计数器加1,直接将指针向后跳转5位,跳过已统计的整段元素,继续从跳转后的位置开始下一轮检查
- 若检查中途发现不等值,仅将指针向后移动1位,从下一个元素位置重新开始检测
- 当指针位置剩余元素不足5个时,直接终止遍历,输出最终统计的组数
通用算法流程
- 初始化变量:遍历指针
ptr = 0,统计组数total = 0 - 循环条件:当
ptr位置到数组末尾的元素总数≥5时持续执行 - 连续值检测:
- 取
ptr位置的数值为基准值,依次向后比对后续4个位置的元素 - 若所有位置元素和基准值一致:
total +=1,执行ptr +=5完成跳步 - 若中途出现不一致元素:执行
ptr +=1,移动到下一个位置
- 取
- 循环终止后返回
total值
参考实现代码
Python 版本
def count_5_consecutive_groups(data): total = 0 ptr = 0 data_len = len(data) while ptr <= data_len - 5: base_val = data[ptr] is_match = True for step in range(1, 5): if data[ptr + step] != base_val: is_match = False break if is_match: total += 1 ptr += 5 else: ptr += 1 return total
Matlab 版本(适配原有代码逻辑)
total = 0; ptr = 1; data_len = length(data); while ptr <= data_len - 4 base_val = data(ptr); is_match = true; for step = ptr+1:ptr+4 if data(step) ~= base_val is_match = false; break; end end if is_match total = total + 1; ptr = ptr + 5; else ptr = ptr + 1; end end disp(total);
示例校验
- 数组1(9个连续8+3个连续9+零散值):检测到前5个8计1组,指针跳转到第6个8位置,再次检测到后续4个连续8凑够5个值计第2组,剩余元素凑不够连续5个值,最终统计2组,符合预期
- 数组2:6个连续8计1组、8个连续9计1组、5个连续5计1组、5个连续2计1组,总组数4,符合预期
- 数组3:10个连续8计2组、5个连续6计1组,总组数3,符合预期
内容的提问来源于stack exchange,提问作者Karthik Garimella
相关产品推荐
相关产品推荐

