我遇到了一个问题
编写一个算法,使得如果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("-----------------------");
}
我无法确定逻辑中的错误。有人能帮我发现什么是错的吗?
答案 0 :(得分:2)
问题的根源在于您正在写入您正在阅读的同一个数组。
0
处的初始[0][1]
条目将该行的其余部分和下一行中的[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
在[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;
}