📌  相关文章
📜  国际空间研究组织 | ISRO CS 2009 |问题 42(1)

📅  最后修改于: 2023-12-03 15:23:02.801000             🧑  作者: Mango

国际空间研究组织 | ISRO CS 2009 | 问题 42

本题考察的是程序员的数组操作能力。题目描述如下:

给定一个二维整数数组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动态记录,便于后面遍历时快速找到需要清零的行列。