Java 编写一个算法,将矩阵中的值设置为零

Java 编写一个算法,将矩阵中的值设置为零,java,arrays,matrix,Java,Arrays,Matrix,我遇到一个问题 编写一个算法,如果MxN矩阵中的元素为0,则其整行和整列都设置为0 我是java新手,所以我的代码看起来可能不太好。请随时建议我如何使它更好和优化 我在输出上看到的是: 0 0 0 0 0 0 0 0 而不是: 0 0 0 0 1 0 3 4 这是我正在使用的代码: public static void main(String[] args) { int rows=2, cols=4; int[][] arr = { {1,0,2,3}, {1,2,3,4

我遇到一个问题

编写一个算法,如果MxN矩阵中的元素为0,则其整行和整列都设置为0

我是java新手,所以我的代码看起来可能不太好。请随时建议我如何使它更好和优化

我在输出上看到的是:

0 0 0 0
0 0 0 0
而不是:

0 0 0 0 
1 0 3 4
这是我正在使用的代码:

public static void main(String[] args) {
    int rows=2, cols=4; 
    int[][] arr = { {1,0,2,3}, {1,2,3,4} };
    print(arr, rows, cols);
    for(int i=0; i<rows; i++){
        for(int j=0; j<cols; j++){
            if(arr[i][j] == 0){
                for(int t1=0; t1<cols; t1++){
                    arr[i][t1]=0;
                }
                for(int t1=0; t1<rows; t1++){
                    arr[t1][j]=0;
                }
            }
            print(arr, rows,cols);
        }
    }
}
private static void print(int[][]arr, int rows, int cols) {
    for(int i=0; i<rows; i++){
        for(int j=0; j<cols; j++){
            System.out.print(arr[i][j] + " ");
        }
                System.out.println("\n");
    }
    System.out.println("-----------------------");
}
publicstaticvoidmain(字符串[]args){
int行=2,cols=4;
int[]arr={{1,0,2,3},{1,2,3,4};
打印(arr、行、列);

对于(int i=0;i而言,问题的根源在于您正在向读取的同一数组写入数据

位于
[0][1]
的初始
0
条目将该行的其余部分和下一行中的
[1][1]
元素调零。由于您替换了行中的值,因此对外部循环的后续检查将作为true触发,从而导致整个数组调零

具体而言,问题出现在该代码段的第三行:

for(int i=0; i<rows; i++){
    for(int j=0; j<cols; j++){
        if(arr[i][j] == 0){  // problem is here
如果(arr[i][j]==0)
检查将在
[0][2]
[0][3]
触发,这将导致:

0 0 0 0
1 0 0 0
当您到达
[1][1]
元素时,第二行的其余部分被调零


解决此问题的一种简单而简单的方法是简单地声明与第一个数组相同的第二个数组,然后对第二个数组进行更新

int[][] arr2 = { {1,0,2,3}, {1,2,3,4} };
...
    for(int t1=0; t1<cols; t1++){
        arr2[i][t1]=0;
    }
    for(int t1=0; t1<rows; t1++){
         arr2[t1][j]=0;
    }
int[]arr2={{1,0,2,3},{1,2,3,4};
...

对于(int t1=0;t1)由于您的代码可以正常工作,因此这可能更适合于代码审查()Stack Exchange是一个问答网站,用于寻求同行对您的代码进行审查。我们正在共同努力,通过获取工作代码并使其更好来提高全球程序员的技能。首先,制作一个方法,该方法采用数组并返回结果(虽然这是一个需要与面试官澄清的问题——他们是想让你修改原始数组,还是返回一个新数组?)。当他们问这样的问题时,他们想看看你的方法,他们可能会建议你优化它。例如,你的算法想法是O(n^3),我希望有一个很好的O(n^2)解决方案。不,我认为你的代码工作不正确。如果(0,0)处的单元格为0,你的代码将一步一步地创建一个矩阵,以所有单元格为0的矩阵结束。对吗?所以这不是代码复查或重构的问题。问题是,为什么算法工作不正确;-)你甚至测试过这段代码吗?“我写了运行良好的算法”-您对“运行良好”的定义是什么?示例矩阵显然创建了错误的输出。
int[][] arr2 = { {1,0,2,3}, {1,2,3,4} };
...
    for(int t1=0; t1<cols; t1++){
        arr2[i][t1]=0;
    }
    for(int t1=0; t1<rows; t1++){
         arr2[t1][j]=0;
    }