在二维数组中找到沿轴的非零数字索引

时间:2015-07-07 02:38:16

标签: java arrays matrix

解决了下面提到的问题,这是解决这个问题的蛮力方式。任何人都可以帮我找到更好的解决方案。它需要返回索引,所以我使用String作为返回类型,这里也是在返回索引的情况下需要一些改进。

public class FindNonNegativeAxisIndex {

    public static String getAxisIndex(int arr[][], int row, int col) {

        int rowCount = 0;
        int colCount = 0;
        if (row == 0 && col == 0)
            return null;

        for (int i = 0; i < row; i++) {
            rowCount = 0;
            colCount = 0;
            for (int j = 0; j < col; j++) {
                if (arr[i][j] > 0) {

                    for (int k = 0; k < row; k++) {
                        if (arr[k][j] > 0)
                            rowCount++;

                    }

                    for (int l = 0; l < col; l++) {
                        if (arr[i][l] > 0)
                            colCount++;
                    }
                    if (rowCount == 1 && colCount == 1)
                        return i + " " + j;
                }
            }
        }

        return null;

    }

    public static void main(String[] args) {

        int arr[][] = { { 0, 0, 3, 0 }, { 0, 1, 0, 0 }, { 0, 0, 2, 4 },
                { 5, 0, 0, 0 } };
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                System.out.print(arr[i][j] + "\t");
            }
            System.out.println();
        }
        String value = getAxisIndex(arr, 4, 4);
        String index[] = value.split(" ");
        System.out.println("row " + index[0] + "  col " + index[1]);

    }

}

1 个答案:

答案 0 :(得分:1)

最简单的事情是只检查每一行。我们正在寻找非空值。如果我们只发现一次这样的值,那么我们也检查该列,否则转到下一行。这样,您最多有两个嵌套循环。

另请注意,一旦我们发现当前数字不令人满意,就不需要迭代循环。在这种情况下,我们可以使用break。最后你不应该创建一个字符串,然后拆分它。最好返回一个自定义对象,但为了简单起见,返回一个双元素int[]数组是可以的。这是整个代码:

public static int[] getAxisIndex(int arr[][], int row, int col) {
    if (row == 0 && col == 0)
        return null;

    for (int i = 0; i < row; i++) {
        int nonNullCol = -1;
        for(int j=0; j<col; j++) {
            if(arr[i][j] != 0) {
                if(nonNullCol == -1) {
                    nonNullCol = j;
                } else {
                    nonNullCol = -1;
                    break;
                }
            }
        }
        if(nonNullCol != -1) {
            for(int ii = 0; ii < row; ii++) {
                if(ii != i && arr[ii][nonNullCol] != 0) {
                    nonNullCol = -1;
                    break;
                }
            }
            if(nonNullCol != -1)
                return new int[] {i, nonNullCol};
        }
    }
    return null;
}

public static void main(String[] args) {

    int arr[][] = { { 0, 0, 3, 0 }, { 0, 1, 0, 0 }, { 0, 0, 2, 4 },
            { 5, 0, 0, 0 } };
    for (int i = 0; i < 4; i++) {
        for (int j = 0; j < 4; j++) {
            System.out.print(arr[i][j] + "\t");
        }
        System.out.println();
    }
    int[] idx = getAxisIndex(arr, 4, 4);
    if(idx == null)
        System.out.println("Not found");
    else
        System.out.println("row " + idx[0] + "  col " + idx[1]);
}