如何实现二维数组元素与后续两个水平元素相加并解决索引越界问题?
问题描述
需要将二维数组中每个元素与其右侧相邻的两个元素进行水平相加(同一行内列方向),同时避免数组越界。例如输入6×6的全1二维数组:
[1, 1, 1, 1, 1, 1] [1, 1, 1, 1, 1, 1] [1, 1, 1, 1, 1, 1] [1, 1, 1, 1, 1, 1] [1, 1, 1, 1, 1, 1] [1, 1, 1, 1, 1, 1]
期望输出为包含36个3的一维数组:
[3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3]
尝试的代码如下(运行时出现索引越界异常):
int n = 2; for (int x = 0; x < array.length; x++ ) { for (int y = 0; y < array.length; y++){ for(int j = x+1; j <= x + n && j < array.length; j++ ){ l.add(array[x][y] + array[x + j][y]); }
修正方案
原代码错误分析
- 方向逻辑混淆:需求是水平方向(同一行内列相邻)相加,但代码错误操作了行索引(
x + j),变成了垂直方向的元素相加。 - 索引越界:
x + j会导致行索引超出数组长度,直接触发越界异常。 - 求和逻辑错误:代码仅实现了两两元素相加,未完成“当前元素+右侧两个元素”的三数求和需求。
正确代码(匹配期望输出)
以下代码通过取模运算实现循环取元素,确保即使是数组末尾的元素,也能从数组开头获取“右侧”元素,从而得到全3的输出:
List<Integer> l = new ArrayList<>(); int adjacentCount = 2; // 右侧相邻元素的个数 int rows = array.length; if (rows == 0) { return l; } int cols = array[0].length; // 遍历每一行 for (int x = 0; x < rows; x++) { // 遍历当前行的每个元素 for (int y = 0; y < cols; y++) { int sum = array[x][y]; // 加上右侧第一个元素,取模避免越界 int nextCol1 = (y + 1) % cols; sum += array[x][nextCol1]; // 加上右侧第二个元素 int nextCol2 = (y + 2) % cols; sum += array[x][nextCol2]; l.add(sum); } }
另一种可选方案(越界补0)
如果需求是当右侧无元素时视为0,可使用以下代码(此方案下6×6全1数组的最后两个元素和为2、1,不符合你的期望输出):
List<Integer> l = new ArrayList<>(); int adjacentCount = 2; int rows = array.length; if (rows == 0) { return l; } int cols = array[0].length; for (int x = 0; x < rows; x++) { for (int y = 0; y < cols; y++) { int sum = array[x][y]; // 右侧第一个元素存在则累加 if (y + 1 < cols) { sum += array[x][y + 1]; } // 右侧第二个元素存在则累加 if (y + 2 < cols) { sum += array[x][y + 2]; } l.add(sum); } }
内容的提问来源于stack exchange,提问作者user18984687
相关产品推荐
相关产品推荐

