C#实现二维矩阵行回文校验触发索引越界异常问题求解
二维数组逐行回文判断索引越界问题解决方案
问题根因
- 行、列索引用法混淆:判断单行回文时行号固定,仅需对比同一行内对称位置的列元素,原有逻辑错误地将行号、列号的计算逻辑搞反
- 索引越界直接诱因:
- 行索引计算错误:
arr.GetLength(1)是二维数组的列数,用列数减去行号i得到的结果最大等于n,而二维数组行索引的最大值是n-1,当i=0时直接取到行索引n触发越界 - 列索引计算错误:内层循环
j从0开始,首次循环就会取j-1 = -1,列索引为负直接越界
- 行索引计算错误:
- 回文判断逻辑偏离一维基准:原有一维回文逻辑是对比索引
i和长度 - i -1的元素,适配二维时应该对同一行的列索引做对称计算,而非修改行索引 - 输出逻辑写反:flag置为1的触发条件是检测到非对称元素,代表存在行不是回文,原有代码的输出提示和实际逻辑相反
修正方案
将校验和输出部分的代码替换为以下逻辑即可:
int flag = 0; // 遍历每一行 for (int i = 0; i < arr.GetLength(0); i++) { int rowLength = arr.GetLength(1); // 遍历到行的一半即可完成回文校验 for (int j = 0; j < rowLength / 2; j++) { // 同一行i下,对比列j和列 rowLength - j - 1的元素 if (arr[i, j] != arr[i, rowLength - j - 1]) { Console.WriteLine(i); flag = 1; break; } } if (flag == 1) break; // 只要有一行不是回文就可以提前终止校验 } if (flag == 1) { Console.WriteLine("not pali"); } else { Console.WriteLine("pali"); }
内容的提问来源于stack exchange,提问作者Bookuha
相关产品推荐
相关产品推荐

