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

Java矩阵2x3黄金票模式检测问题及代码优化咨询

矩阵黄金票判定问题的正确实现

问题定义

判断矩阵中是否存在「黄金票」:由6个大写字母G组成,形式为连续三行中,同一列位置的两对G(即上下对齐的三行GG),结构如下:

G G
G G
G G

额外要求:矩阵必须为矩形(所有行元素数量相同),否则抛出IllegalArgumentException异常。

现有代码问题

你当前的代码逻辑存在核心错误:仅统计GG对的数量,未验证这些GG对是否在连续三行的同一列位置。这种逻辑会误判示例2(分散的GG对被错误计数为符合条件),导致错误返回true。

正确实现思路

  1. 合法性检查:先处理矩阵为null、空矩阵、非矩形的情况;
  2. 边界判断:若矩阵行数不足3或列数不足2,直接返回false(无法容纳黄金票结构);
  3. 遍历可能的黄金票起始位置:
    • 起始行i的范围是0到rows-3(需要连续三行);
    • 起始列j的范围是0到cols-2(需要连续两列);
  4. 验证黄金票结构:检查(i,j)、(i,j+1)、(i+1,j)、(i+1,j+1)、(i+2,j)、(i+2,j+1)是否均为G,满足则立即返回true;
  5. 遍历结束未找到则返回false。

完整正确代码

public static boolean goldenTicket(char[][] matrix) {
    // 处理空矩阵或null情况
    if (matrix == null || matrix.length == 0) {
        return false;
    }
    int rows = matrix.length;
    int cols = matrix[0].length;
    
    // 检查矩阵是否为矩形
    for (char[] row : matrix) {
        if (row.length != cols) {
            throw new IllegalArgumentException("Length of row doesn't match");
        }
        if (row.length == 0) {
            return false;
        }
    }
    
    // 边界判断:行数不足3或列数不足2,直接返回false
    if (rows < 3 || cols < 2) {
        return false;
    }
    
    // 遍历所有可能的黄金票起始位置
    for (int i = 0; i <= rows - 3; i++) {
        for (int j = 0; j <= cols - 2; j++) {
            // 检查连续三行的同一列位置是否都是GG
            if (matrix[i][j] == 'G' && matrix[i][j+1] == 'G'
                && matrix[i+1][j] == 'G' && matrix[i+1][j+1] == 'G'
                && matrix[i+2][j] == 'G' && matrix[i+2][j+1] == 'G') {
                return true;
            }
        }
    }
    
    return false;
}

优化说明

  1. 提前终止:一旦找到符合条件的黄金票,立即返回true,避免不必要的遍历;
  2. 清晰的边界处理:先判断行数/列数是否足够容纳黄金票,减少无效循环;
  3. 变量命名直观:rows、cols替代模糊的命名,提升代码可读性;
  4. 合法性检查集中:将矩阵矩形检查统一放在开头,逻辑更清晰。

内容的提问来源于stack exchange,提问作者dotJSON

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 18:40:31