📅  最后修改于: 2023-12-03 15:23:02.801000             🧑  作者: Mango
本题考察的是程序员的数组操作能力。题目描述如下:
给定一个二维整数数组arr,其中每个元素都是正整数或0。现在需要将数组中所有值为0的元素所在的整行整列清零。请实现函数void zeroMatrix(int[][] arr),其中arr为所给二维整数数组。
示例:
输入:
arr = [
[1, 2, 3, 4],
[1, 2, 0, 4],
[0, 2, 3, 4],
[1, 2, 3, 4]
]
输出:
[
[0, 2, 0, 4],
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 2, 0, 4]
]
我们可以遍历整个二维数组,找到所有为0的元素,然后将其所在的整行和整列全部置为0。
为了实现这个思路,我们需要先定义一个列表zeroRows,一个列表zeroCols,分别用于记录所有需要清零的行和列。然后再次遍历数组,当发现一个元素为0时,将其所在的行和列记录下来。最后再次遍历数组,将所有需要清零的行和列置为0即可。
以下是Java代码实现:
public static void zeroMatrix(int[][] arr) {
if (arr == null) return;
int row = arr.length; // 行数
int col = arr[0].length; // 列数
ArrayList<Integer> zeroRows = new ArrayList<>(); // 需要清零的行
ArrayList<Integer> zeroCols = new ArrayList<>(); // 需要清零的列
// 找到所有的0元素所在的行列
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
if (arr[i][j] == 0) {
zeroRows.add(i);
zeroCols.add(j);
}
}
}
// 清零
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
if (zeroRows.contains(i) || zeroCols.contains(j)) {
arr[i][j] = 0;
}
}
}
}
本题考察了程序员的数组操作能力,实现思路比较简单。需要注意的是,我们在找到所有0元素所在行列时,需要使用ArrayList动态记录,便于后面遍历时快速找到需要清零的行列。