二维数组特定路径求和实现疑问及代码调试请求
问题:按指定路径遍历二维数组计算数字总和
给定一个字符串二维数组,需按照指定路径(由方向指令"L"左、"R"右、"D"下、"U"上引导)遍历,计算路径上所有数字的总和(示例:1+2+3+4+5+6+7+8+9=45)。我不确定是否可以在for循环内嵌套while循环,自己编写了sumPath代码但无法正确实现功能,请求帮忙修正:
int sumPath(String[][] maze) { int sum = 0; for (int i = 0; i < maze.length; i++) { for (int j = 0; j < maze[0].length; j++) { while (!(maze[i][j].equals("E") && (!(maze[i][j].equals("0"))))) { if (maze[i][j].equals("R")) { j++; // 向右移动(列+1) } else if (maze[i][j].equals("D")) { i++; // 向下移动(行+1) } else if (maze[i][j].equals("L")) { j--; // 向左移动(列-1) } else if (maze[i][j].equals("U")) { i--; // 向上移动(行-1) } else if (!(maze[i][j].equals("R") || maze[i][j].equals("D") || maze[i][j].equals("L") || maze[i][j].equals("U") || maze[i][j].equals("E"))) { sum += Integer.parseInt(maze[i][j]); } break; } } } return sum; }
代码问题分析
- 外层循环冗余:嵌套的
for循环会遍历数组所有单元格,但路径是连续的单一路线,不需要逐个遍历单元格,应从起点出发沿方向移动直到终点"E"。 - while循环逻辑错误:
- 条件表达式逻辑混乱,正确的终止条件应为当前单元格是"E"。
- 循环内的
break语句会导致while只执行一次,失去循环移动的作用。
- 边界未处理:移动时未判断
i和j是否越界,可能抛出数组下标越界异常。 - 无防死循环机制:未标记已访问的单元格,若路径出现循环会陷入死循环。
修正后的代码
int sumPath(String[][] maze) { if (maze == null || maze.length == 0 || maze[0].length == 0) { return 0; } int sum = 0; int rows = maze.length; int cols = maze[0].length; int i = 0, j = 0; // 假设起点为(0,0),若需动态确定起点可遍历数组查找 boolean[][] visited = new boolean[rows][cols]; // 标记已访问单元格,防止死循环 // 循环移动直到到达终点E或越界/出现循环 while (i >= 0 && i < rows && j >= 0 && j < cols && !maze[i][j].equals("E")) { if (visited[i][j]) { break; // 出现循环,终止遍历 } visited[i][j] = true; String current = maze[i][j]; switch (current) { case "R": j++; break; case "D": i++; break; case "L": j--; break; case "U": i--; break; default: // 当前是数字,加入总和 sum += Integer.parseInt(current); break; } } return sum; }
说明
- 去掉了冗余的外层
for循环,改为从起点出发沿方向连续移动。 - 增加了边界判断和已访问标记,避免越界和死循环。
- 用
switch语句替代多分支if-else,提高代码可读性。 - 若起点不是固定的(0,0),可先遍历数组找到路径起点(例如第一个非方向、非E的单元格)。
内容的提问来源于stack exchange,提问作者Cradles
相关产品推荐
相关产品推荐

