You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

二维数组特定路径求和实现疑问及代码调试请求

问题:按指定路径遍历二维数组计算数字总和

给定一个字符串二维数组,需按照指定路径(由方向指令"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;
}

代码问题分析

  1. 外层循环冗余:嵌套的for循环会遍历数组所有单元格,但路径是连续的单一路线,不需要逐个遍历单元格,应从起点出发沿方向移动直到终点"E"。
  2. while循环逻辑错误:
    • 条件表达式逻辑混乱,正确的终止条件应为当前单元格是"E"。
    • 循环内的break语句会导致while只执行一次,失去循环移动的作用。
  3. 边界未处理:移动时未判断i和j是否越界,可能抛出数组下标越界异常。
  4. 无防死循环机制:未标记已访问的单元格,若路径出现循环会陷入死循环。

修正后的代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 23:20:39