【问题标题】:How to find 2x3 pattern in matrix Java如何在矩阵 Java 中找到 2x3 模式
【发布时间】:2023-01-28 14:45:05
【问题描述】:

这个算法让我难住了。我是数据结构和算法的新手,我了解代码需要做什么,但无法全神贯注于如何实际编码。

问题如下:

确定矩阵是否包含金票。一张金票由 6 个大写字母“G”组成,其中三对 G 位于彼此的正上方,如下所示。请注意,我省略了单引号以提高可读性。

GG GG GG

例如。,

[A b - - C d m]
[- G G ZGG-]

[H o - rGGD] 这个矩阵返回真

[H o - rGGD]

例如。,

[RgG- C d m W]
[-GGZGG- r] 这个矩阵返回 false

[oGGrGGD]因为G不在指定位置

[ST C -GGa -] 相对于彼此

矩阵应该是“矩形”的,这意味着所有行都应该有相同数量的元素。如果不是这种情况,则应抛出 IllegalArgumentException。

这是我写的:

public static boolean goldenTicket(char[][] matrix) {
    if (matrix == null) return false;
    if (matrix.length == 0) return false;
        
    char char1, char2;
    int matchCount = 0;
    int indexOne = 0, indexTwo = 0, prevIndex1 = 0,prevIndex2 = 0;
    int rows = matrix.length;
    int columns = matrix[0].length;

        
    for(int i = 0; i < rows;i++) {
        if(matrix[i].length != columns) 
            throw new IllegalArgumentException("Length of row doesn't match");
    if(matrix[i].length == 0) return false;
            
    if(matchCount == 3) return true;
    for(int j=1;j<columns;j++) {
        if(matrix[i][j] == 'G' && matrix[i][j - 1] =='G') {
            if(prevIndex1 == 0 && prevIndex2 == 0) {
                indexOne = j-1;
            indexTwo = j;
                matchCount++;       
            }
            else {
                prevIndex1 = j-1;
            prevIndex2 = j;
            matchCount++;
                }
                        
            }
                
    }
            
    if(prevIndex1 == indexOne && prevIndex2 == indexTwo) {
        matchCount++;
    }
}
        
    return false;
}

但是,问题是代码通过了上面的示例一和示例二,而不是仅通过了示例 1。 我已经交了作业,只通过了 24/25 测试,我真的很想了解它应该如何工作,也许是一种更好的编码方式以供将来参考。

提前致谢!

【问题讨论】:

    标签: java arrays algorithm multidimensional-array data-structures


    【解决方案1】:

    要在 Java 中的矩阵中查找 2x3 模式,您可以使用嵌套循环遍历矩阵的行和列,并检查特定索引处的元素是否与模式匹配。以下是如何编写方法来执行此操作的示例:

    public boolean findPattern(int[][] matrix, int[][] pattern) {
        for (int i = 0; i <= matrix.length - pattern.length; i++) {
            for (int j = 0; j <= matrix[i].length - pattern[0].length; j++) {
                boolean match = true;
                for (int m = 0; m < pattern.length; m++) {
                    for (int n = 0; n < pattern[m].length; n++) {
                        if (matrix[i + m][j + n] != pattern[m][n]) {
                            match = false;
                            break;
                        }
                    }
                    if (!match) {
                        break;
                    }
                }
                if (match) {
                    return true;
                }
            }
        }
        return false;
    }
    

    在此示例中,该方法接受两个参数:矩阵和您要查找的模式。最外层的循环遍历矩阵的行。下一个循环遍历矩阵的列。接下来的两个嵌套循环遍历模式的行和列。最里面的循环比较矩阵的元素和相同索引处的模式。如果所有索引处的元素都匹配,则该方法返回 true。如果该方法未找到匹配项,则返回 false。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-31
      • 1970-01-01
      • 2018-04-19
      • 1970-01-01
      • 1970-01-01
      • 2022-11-21
      • 1970-01-01
      • 2019-08-31
      相关资源
      最近更新 更多