Java矩阵2x3黄金票模式检测问题及代码优化咨询
矩阵黄金票判定问题的正确实现
问题定义
判断矩阵中是否存在「黄金票」:由6个大写字母G组成,形式为连续三行中,同一列位置的两对G(即上下对齐的三行GG),结构如下:
G G G G G G
额外要求:矩阵必须为矩形(所有行元素数量相同),否则抛出IllegalArgumentException异常。
现有代码问题
你当前的代码逻辑存在核心错误:仅统计GG对的数量,未验证这些GG对是否在连续三行的同一列位置。这种逻辑会误判示例2(分散的GG对被错误计数为符合条件),导致错误返回true。
正确实现思路
- 合法性检查:先处理矩阵为
null、空矩阵、非矩形的情况; - 边界判断:若矩阵行数不足3或列数不足2,直接返回
false(无法容纳黄金票结构); - 遍历可能的黄金票起始位置:
- 起始行
i的范围是0到rows-3(需要连续三行); - 起始列
j的范围是0到cols-2(需要连续两列);
- 起始行
- 验证黄金票结构:检查
(i,j)、(i,j+1)、(i+1,j)、(i+1,j+1)、(i+2,j)、(i+2,j+1)是否均为G,满足则立即返回true; - 遍历结束未找到则返回
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; }
优化说明
- 提前终止:一旦找到符合条件的黄金票,立即返回
true,避免不必要的遍历; - 清晰的边界处理:先判断行数/列数是否足够容纳黄金票,减少无效循环;
- 变量命名直观:
rows、cols替代模糊的命名,提升代码可读性; - 合法性检查集中:将矩阵矩形检查统一放在开头,逻辑更清晰。
内容的提问来源于stack exchange,提问作者dotJSON
相关产品推荐
相关产品推荐

