C# 实现查找二维矩阵行内连续相同元素的方法咨询
问题分析与修复方案
现有代码存在的问题
- 索引越界风险:内层循环终止条件设置错误,当
item遍历到当前行最后一个元素时,playingField[row, item+1]会超出数组下标范围,直接抛出IndexOutOfRangeException异常 - 计数器逻辑错误:
counter是全局声明的,遍历完一行后没有重置,跨行的相同元素会被错误累加,导致计数结果完全不符合预期 - 匹配判断逻辑滞后:只有在整个二维矩阵遍历完成后才判断计数是否达标,不仅无法提前终止遍历优化性能,也无法正确识别每一行的连续匹配场景
修正后的实现代码
bool ScoreRowPresent(RegularCandies[,] playingField) { // 提前校验边界,避免空数组/列数不足的情况 int rowCount = playingField.GetLength(0); int colCount = playingField.GetLength(1); if (rowCount == 0 || colCount < 3) { return false; } for (int row = 0; row < rowCount; row++) { // 每行遍历前重置计数器 int counter = 1; // 只遍历到倒数第二个元素,避免下标越界 for (int item = 0; item < colCount - 1; item++) { int currentCandyValue = (int)playingField[row, item]; int nextCandyValue = (int)playingField[row, item + 1]; if (currentCandyValue == nextCandyValue) { counter++; // 只要达到连续3个就直接返回结果,无需继续遍历 if (counter >= 3) { return true; } } else { // 元素不相等就重置计数器 counter = 1; } } } // 所有行遍历完未找到符合条件的连续元素 return false; }
核心修改说明
- 新增前置边界校验:如果列数小于3,不可能出现连续3个相同元素,直接返回false,避免无效遍历
- 计数器作用域调整:移到行遍历逻辑内部,每行遍历开始时重置计数器,避免跨行计数错误
- 修正循环终止条件:
item < colCount - 1保证不会访问到超出列范围的下标,彻底解决越界问题 - 新增不匹配重置逻辑:相邻元素不相等时直接重置计数器,保证计数始终对应当前连续相同元素的数量
- 匹配达标后提前返回:只要找到任意一行有连续3个相同元素就直接返回true,大幅提升遍历效率
内容的提问来源于stack exchange,提问作者Sofia190
相关产品推荐
相关产品推荐

