【华为OD题库-017】矩阵稀疏扫描-Java

题目

如果矩阵中的许多系数都为零,那么该矩阵就是稀疏的。对稀疏现象有兴趣是因为它的开发可以带来巨大的计算节省,并且在许多大的实践中都会出现矩阵稀疏的问题。给定一个矩阵, 现在需要逐行和逐列地扫描矩阵,如果某一行或者某一列内,存在连续出现的0的个数超过了行宽或者列宽的
一半W/2整除),则认为该行或者该列是稀疏的。
扫描给定的矩阵,输出稀疏的行数和列数
输入描述
第一行输入为M和N,表示矩阵的大小M * N,0<M <=100,0< N <=100
接下来M行输入为矩阵的成员,每行N个成员,矩阵成员都是有符号整数,范围-32768到32767
输出描述
输出两行,第一行表示稀疏行的个数,第二行表示稀疏列的个数
示例1:
输入
3 3
1 0 0
0 1 0
0 0 1
输出
3
3
说明
给定的3 * 3矩阵里,每一行和每一列内都存在2个0, 行宽3,列宽3,[3/2]= 1,因此稀疏行有3个,稀疏列有3个。
示例2:
输入
5 3
-1 0 1
0 0 0
-1 0 0
0 -1 0
0 0 0
输出
5
3
说明
给定的 5 * 3矩阵,每行里面0的个数大于等于1表示稀疏行,每列里面0的个数大于等于2表示稀疏列,所以有5个稀疏行,3个稀疏列

思路

简单题,直接遍历矩阵,统计其每行、每列为0的个数即可。
最后判断是否大于行宽/列宽的一般,得出稀疏行、列的个数

题解

package hwod;

import java.util.Scanner;

public class MatrixScan {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String[] firstLines = sc.nextLine().split(" ");
        int m = Integer.parseInt(firstLines[0]);
        int n = Integer.parseInt(firstLines[1]);
        int[][] matrix = new int[m][n];
        for (int i = 0; i < m; i++) {
            String[] rows = sc.nextLine().split(" ");
            for (int j = 0; j < n; j++) {
                matrix[i][j] = Integer.parseInt(rows[j]);
            }
        }
        int[] res = getRAndC(matrix);
        System.out.println(res[0]);
        System.out.println(res[1]);
    }

    private static int[] getRAndC(int[][] matrix) {
        int m = matrix.length, n = matrix[0].length;
        int[] rows = new int[m];
        int[] cols = new int[n];

        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (matrix[i][j] == 0) {
                    rows[i]++;
                    cols[j]++;
                }
            }
        }
        int rowRes = 0, colRes = 0;
        int rowThreshold = n / 2, colThreshold = m / 2;
        for (int r : rows) {
            if(r>=rowThreshold) rowRes++;
        }
        for (int c : cols) {
            if(c>=colThreshold) colRes++;
        }

        return new int[]{rowRes, colRes};
    }
}

推荐

如果你对本系列的其他题目感兴趣,可以参考华为OD机试真题及题解(JAVA),查看当前专栏更新的所有题目。

说明

本专栏所有文章均为原创,欢迎转载,请注明文章出处:https://blog.csdn.net/qq_31076523/article/details/134176793。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
矩阵稀疏扫描是指对于一个二维矩阵,按照行优先的顺序扫描矩阵中的元素,并将非零元素按照行优先的顺序存储到一个一维数组中。 以下是一个使用Java语言实现的矩阵稀疏扫描的示例代码: ```java public class MatrixSparseScan { public static int[] sparseScan(int[][] matrix) { int row = matrix.length; // 矩阵的行数 int col = matrix[0].length; // 矩阵的列数 // 计算非零元素的个数 int count = 0; for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { if (matrix[i][j] != 0) { count++; } } } // 创建稀疏数组 int[] sparseArray = new int[count * 3 + 1]; sparseArray[0] = row; // 存储矩阵的行数 sparseArray[1] = col; // 存储矩阵的列数 sparseArray[2] = count; // 存储非零元素的个数 int index = 3; // 稀疏数组的索引 for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { if (matrix[i][j] != 0) { sparseArray[index++] = i; // 存储非零元素的行索引 sparseArray[index++] = j; // 存储非零元素的列索引 sparseArray[index++] = matrix[i][j]; // 存储非零元素的值 } } } return sparseArray; } public static void main(String[] args) { int[][] matrix = { {1, 0, 0}, {0, 2, 0}, {0, 0, 3} }; int[] sparseArray = sparseScan(matrix); for (int i = 0; i < sparseArray.length; i++) { System.out.print(sparseArray[i] + " "); } } } ``` 运行上述代码,输出结果为:3 3 3 0 0 1 1 1 2 2 2 3。其中,3表示矩阵的行数,3表示矩阵的列数,3表示非零元素的个数,接下来依次为非零元素的行索引、列索引和值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值