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


    题目

    如果矩阵中的许多系数都为零,那么该矩阵就是稀疏的。对稀疏现象有兴趣是因为它的开发可以带来巨大的计算节省,并且在许多大的实践中都会出现矩阵稀疏的问题。给定一个矩阵, 现在需要逐行和逐列地扫描矩阵,如果某一行或者某一列内,存在连续出现的0的个数超过了行宽或者列宽的
    一半W/2整除),则认为该行或者该列是稀疏的。
    扫描给定的矩阵,输出稀疏的行数和列数
    输入描述
    第一行输入为M和N,表示矩阵的大小M * N,0 接下来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};
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    推荐

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

  • 相关阅读:
    一篇带你精通php
    好多自恋性数
    入门【网络安全/黑客】启蒙教程
    机器学习吴恩达
    国密SSL证书保障网站安全
    C++中嵌入汇编语言的方法(这个方法被证明在64位电脑上使用visual studio没有用)
    ARTS打卡第四周之删除链表倒数第几个节点、gdb start命令、扩散模型、如何学习分享
    HAProxy的详解和使用
    数据结构——排序
    LeetCode20 有效的括号
  • 原文地址:https://blog.csdn.net/qq_31076523/article/details/134377118