如何编写脚本分析整数数组相邻重复序列并生成指定元组数组?
修复相邻重复元素分组的C#代码问题
先拆解下你这段代码里的几个核心问题:
- 元组顺序搞反了:你需要的是*(值, 首次出现位置, 重复次数)*,但原代码添加的是
(subArraySize, array[subArrayStart], subArrayStart),顺序完全不符合需求 subArraySize的递增逻辑混乱:每次循环末尾无条件执行subArraySize++,会导致计数重复叠加,最终统计的次数完全错误- 最后一个元素的处理逻辑有漏洞,没有正确判断它是否属于前一个分组
下面是修正后的完整代码,完美匹配你想要的输出效果:
// 示例输入数组,你也可以替换成handStacks int[] array = new int[] { 1, 2, 2, 3, 1, 5, 4, 4, 1, 1, 1 }; var analysis = new List<(int Value, int StartIndex, int Count)>(); // 处理空数组的边界情况,避免后续报错 if (array.Length == 0) { return; } int subArrayStart = 0; int subArraySize = 1; // 从第二个元素开始遍历,对比当前元素和分组起始元素 for (int x = 1; x < array.Length; x++) { int curr = array[x]; if (curr != array[subArrayStart]) { // 遇到不同元素,添加当前完成的分组 analysis.Add( (array[subArrayStart], subArrayStart, subArraySize) ); // 重置分组参数,开始新的分组 subArrayStart = x; subArraySize = 1; } else { // 元素相同,重复次数加1 subArraySize++; } } // 循环结束后,添加最后一组元素(循环里不会触发最后一组的添加) analysis.Add( (array[subArrayStart], subArrayStart, subArraySize) ); // 可以用这段代码验证输出结果 foreach (var group in analysis) { Console.WriteLine($"({group.Value}, {group.StartIndex}, {group.Count})"); }
核心逻辑说明:
- 先处理空数组的边界场景,避免索引越界问题
- 从数组第二个元素开始遍历,直接和当前分组的起始元素对比,逻辑更简洁
- 遇到不同元素时,立即把当前分组的元组加入列表,同时重置分组的起始位置和计数
- 循环结束后必须单独添加最后一组,因为循环内只有遇到不同元素才会触发添加操作,最后一组没有触发条件
运行这段代码后,输出结果完全符合你的预期:
[(1, 0, 1), (2, 1, 2), (3, 3, 1), (1, 4, 1), (5, 5, 1), (4, 6, 2), (1, 8, 3)]
内容的提问来源于stack exchange,提问作者Hershul
相关产品推荐
相关产品推荐

