【问题标题】:How to remove rows and columns containing only zeros from a 2d matrix?如何从二维矩阵中删除仅包含零的行和列?
【发布时间】:2021-03-01 06:17:24
【问题描述】:

给定一个大小为M x N 的整数矩阵,您必须编写一个程序来删除由全零组成的所有行和列。您的程序必须删除那些仅由零值元素组成的行和列。也就是说,如果一行(列)中的所有元素都为零,则删除该行(列)。应该输出所有剩余的行和列。

输入规范:

  • 输入的第一行将有两个整数,例如M 和N。 M 指定矩阵中的行数,N 指定矩阵中的列数。
  • 后面是M 行,每行由N 整数组成。注意:假设1 <= M <= 10 和1 <= N <= 10。此外,您可以假设给定矩阵中至少有一个非零元素。

输出规格:

  • 输出应该是结果矩阵。
  • 输出矩阵的每一行都应以换行符结束。
  • 每行的连续元素之间应该恰好有一个空格(不是制表符)。

示例 1:

Sample Input:
4 4
1 2 3 4
0 0 0 0
5 6 7 8
0 0 0 3

Sample Output:
1 2 3 4
5 6 7 8
0 0 0 3

示例2:

Sample Input:
4 5
1 2 0 3 5
0 0 0 0 0
4 5 0 6 9
7 8 0 9 1

Sample Output:
1 2 3 5
4 5 6 9
7 8 9 1

【问题讨论】:

    标签: java math matrix multidimensional-array


    【解决方案1】:

    我找到的解决方案如下。它仅适用于具有非负数或非正数的行和列:

    import java.util.Scanner;
    
    public class RemoveZeroFromMatrix {
        public static void main(String[] args) {
            Scanner s = new Scanner(System.in);
            System.out.println("enter rows and column");
            int m = s.nextInt();
            int n = s.nextInt();
            int[][] a = new int[m][n];
            int[][] b = new int[m][n];
            int[][] c = new int[m][n];
            System.out.println("enter the matrix");
            for (int i = 0; i < m; i++) {
                for (int j = 0; j < n; j++) {
                    a[i][j] = s.nextInt();
                }
            }
            System.out.println("input matrix");
            for (int i = 0; i < m; i++) {
                for (int j = 0; j < n; j++) {
                    System.out.print(a[i][j] + " ");
                }
                System.out.println();
            }
            int sumRow = 0, x = 0;
            for (int i = 0; i < m; i++) {
                for (int j = 0; j < n; j++) {
                    sumRow += a[i][j];
                }
                if (sumRow != 0) {
                    for (int k = 0; k < n; k++) {
                        b[i - x][k] = a[i][k];
                    }
                } else {
                    x++;
                }
                sumRow = 0;
            }
            int sumCol = 0, y = 0, temp = 0;
            for (int i = 0; i < m; i++) {
                for (int j = 0; j < n - x; j++) {
                    sumCol += b[j][i];
                }
                if (sumCol != 0) {
                    for (int k = 0; k < n - x; k++) {
                        if (temp == 0) {
                            c[k][i] = b[k][i];
                        }
                        if (temp == 1 && n > 3) {
                            c[k][i] = b[k][i + 1];
                        }
                    }
                } else {
                    for (int k = 0; k < n - x; k++) {
                        c[k][i] = b[k][i + 1];
                        temp = 1;
                    }
                }
                sumCol = 0;
            }
            System.out.println("outut matix:");
            for (int i = 0; i < m - x; i++) {
                for (int j = 0; j < n - y - temp; j++) {
                    System.out.print(c[i][j] + " ");
                }
                System.out.println();
            }
        }
    }
    

    【讨论】:

    • 只有在保证矩阵中的所有数字都是非负数或非正数的情况下,才能根据 0 测试行或列的总和。如果它们可以是任何整数,你可以有一个像-5 0 5 这样的行,总和为零,但不全为零。
    • @KevinAnderson 是的,你是对的。我再次检查了此解决方案。它仅适用于具有非负数或非正数的行和列。感谢您的洞察力。
    【解决方案2】:

    从矩阵中删除 列 比删除 行 更困难。出于这个原因,为了简化代码,您可以使用 矩阵转置,如下所示:

    Try it online!

    public static void main(String[] args) {
        int[][] arr1 = {
                {1, 2, 3, 4},
                {0, 0, 0, 0},
                {5, 6, 7, 8},
                {0, 0, 0, 3}};
    
        int[][] arr2 = {
                {1, 2, 0, 3, 5},
                {0, 0, 0, 0, 0},
                {4, 5, 0, 6, 9},
                {7, 8, 0, 9, 1}};
    
        int[][] arr3 = removeZeroRowsNColumns(arr1);
        int[][] arr4 = removeZeroRowsNColumns(arr2);
    
        // output
        Arrays.stream(arr3).map(Arrays::toString).forEach(System.out::println);
        //[1, 2, 3, 4]
        //[5, 6, 7, 8]
        //[0, 0, 0, 3]
        Arrays.stream(arr4).map(Arrays::toString).forEach(System.out::println);
        //[1, 2, 3, 5]
        //[4, 5, 6, 9]
        //[7, 8, 9, 1]
    }
    
    public static int[][] removeZeroRowsNColumns(int[][] arr) {
        return removeZeroRows(removeZeroColumns(arr));
    }
    
    public static int[][] removeZeroColumns(int[][] arr) {
        return transposeMatrix(removeZeroRows(transposeMatrix(arr)));
    }
    
    public static int[][] transposeMatrix(int[][] arr) {
        // assume that we have a rectangular array, i.e. matrix
        int[][] transposed = new int[arr[0].length][arr.length];
        IntStream.range(0, arr.length)
                .forEach(i -> IntStream.range(0, arr[0].length)
                        .forEach(j -> transposed[j][i] = arr[i][j]));
        return transposed;
    }
    
    public static int[][] removeZeroRows(int[][] arr) {
        return Arrays.stream(arr)
                // filter out rows consisting of all zeros
                .filter(row -> !Arrays.stream(row).allMatch(i -> i == 0))
                .toArray(int[][]::new);
    }
    

    【讨论】:

      猜你喜欢
      • 2012-05-26
      • 1970-01-01
      • 1970-01-01
      • 2016-05-26
      • 1970-01-01
      • 2014-02-05
      • 1970-01-01
      • 1970-01-01
      • 2021-08-21
      相关资源
      最近更新 更多