【问题标题】:Write an algorithm to set values to zero in a matrix编写一个算法将矩阵中的值设置为零
【发布时间】:2015-08-19 20:34:40
【问题描述】:

我遇到了一个问题

编写一个算法,如果 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("-----------------------");
}

我无法确定我的逻辑中的错误。有人可以帮我找出问题所在吗?

【问题讨论】:

  • 由于您的代码对您有效,因此这可能更适合代码审查 (codereview.stackexchange.com) Stack Exchange,这是一个用于寻求对您的代码进行同行审查的问答网站。我们正在共同努力,通过改进工作代码来提高全球程序员的技能。
  • 首先,创建一个接受数组并返回结果的方法(尽管这是一个需要向面试官澄清的问题——他们是否希望您修改原始数组,或者正在返回一个新的好吗?)。当他们问这样的问题时,他们想看看你的方法,他们可能会建议你优化它。例如,你的算法思路是 O(n^3),我希望有一个很好的 O(n^2) 解决方案。
  • 不,我认为您的代码不正确。如果 (0,0) 处的单元格为 0,您的代码将逐步创建一个矩阵,该矩阵以所有单元格均为 0 的矩阵结尾。对吗?所以这不是代码审查或重构的问题。这是一个问题,为什么算法不能正确工作。 ;-)
  • 你测试过这段代码吗? “我编写的算法运行良好” - 你对“运行良好”的定义是什么?示例 Matrix 显然创建了错误的输出。

标签: java arrays matrix


【解决方案1】:

问题的根源在于您正在写入与读取相同的数组。

[0][1] 处的初始 0 条目将该行的其余部分和下一行中的 [1][1] 元素清零。因为您替换了内联值,所以您对外部循环的后续检查将触发为真,这会导致整个数组被清零。

具体来说,问题出在这个sn-p的第三行:

for(int i=0; i<rows; i++){
    for(int j=0; j<cols; j++){
        if(arr[i][j] == 0){  // problem is here

处理完[0][1] 元素的第一个零后,您会得到一个如下所示的数组:

0 0 0 0
1 0 3 4

if(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;
    }

【讨论】:

    猜你喜欢
    • 2014-01-01
    • 2014-08-23
    • 1970-01-01
    • 2022-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-08
    相关资源
    最近更新 更多