news 2026/5/26 2:26:13

华为OD机试 B卷 - 稀疏矩阵扫描 (C++ Python JAVA JS GO)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
华为OD机试 B卷 - 稀疏矩阵扫描 (C++ Python JAVA JS GO)

稀疏矩阵扫描

华为OD机试B卷 - 华为OD上机考试B卷 100分题型

华为OD机试真题目录点击查看: 华为OD机试真题题库目录|机考题库 + 算法考点详解

题目描述

如果矩阵中的许多系数都为零,那么该矩阵就是稀疏的。对稀疏现象有兴趣是因为它的开发可以带来巨大的计算节省,并且在许多大的实践中都会出现矩阵稀疏的问题。

给定一个矩阵,现在需要逐行和逐列地扫描矩阵,如果某一行或者某一列内,存在连续出现的0的个数超过了行宽或者列宽的一半 [W /2] (整除) ,则认为该行或者该列是稀疏的。

扫描给定的矩阵,输出稀疏的行数和列数。

输入描述

第一行输入为M和N,表示矩阵的大小M*N,0 < M ≤ 100,0 < N ≤ 100

接下来M行输入为矩阵的成员,每行N个成员,矩阵成员都是有符号整数,范围-32,768到32,767

输出描述

输出两行,第一行表示稀疏行的个数,第二行表示稀疏列的个数

用例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个稀疏列。

题解

思路:模拟

  1. 首先这个题目有点问题,结合题目和用例来看,判断稀疏的情况是行中0的个数大于等于行宽一半, 列中0的个数大于等于列宽一般就认为稀疏
  2. 理明白1的规则之后,这道题就非常简单了,
  3. 统计每行/列中0的次数,然后按照1的规则进行判断统计
  4. 输出结果就行

c++

#include<iostream> #include<vector> #include<string> #include <utility> #include <sstream> #include<algorithm> #include<cmath> #include<map> using namespace std; int main() { int m , n; cin >> m >> n; vector<vector<int>> grid(m, vector<int>(n)); // 行0的个数 vector<int> zeroRowNum(m, 0); // 列0的个数 vector<int> zeroColNum(n, 0); for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { cin >> grid[i][j]; if (grid[i][j] == 0) { zeroRowNum[i]++; zeroColNum[j]++; } } } // 计算满足条件的行和列 int rowResCount = 0, colResCount = 0; for (int i = 0; i < m; i++) { if (zeroRowNum[i] >= n / 2){ rowResCount++; } } for (int i = 0; i < n; i++) { if (zeroColNum[i] >= m / 2){ colResCount++; } } cout << rowResCount << endl; cout << colResCount << endl; }

JAVA

import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int m = sc.nextInt(); int n = sc.nextInt(); int[][] grid = new int[m][n]; // 行0的个数 int[] zeroRowNum = new int[m]; // 列0的个数 int[] zeroColNum = new int[n]; for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { grid[i][j] = sc.nextInt(); if (grid[i][j] == 0) { zeroRowNum[i]++; zeroColNum[j]++; } } } // 计算满足条件的行和列 int rowResCount = 0, colResCount = 0; for (int i = 0; i < m; i++) { if (zeroRowNum[i] >= n / 2) { rowResCount++; } } for (int i = 0; i < n; i++) { if (zeroColNum[i] >= m / 2) { colResCount++; } } System.out.println(rowResCount); System.out.println(colResCount); } }

Python

m,n=map(int,input().split())grid=[]zeroRowNum=[0]*m# 行0的个数zeroColNum=[0]*n# 列0的个数foriinrange(m):row=list(map(int,input().split()))grid.append(row)forjinrange(n):ifrow[j]==0:zeroRowNum[i]+=1zeroColNum[j]+=1# 计算满足条件的行和列rowResCount=sum(1forxinzeroRowNumifx>=n//2)colResCount=sum(1forxinzeroColNumifx>=m//2)print(rowResCount)print(colResCount)

JavaScript

constreadline=require('readline');constrl=readline.createInterface({input:process.stdin,output:process.stdout,terminal:false});letlines=[];rl.on('line',(line)=>{lines.push(line.trim());});rl.on('close',()=>{let[m,n]=lines[0].split(' ').map(Number);letgrid=Array.from({length:m},()=>Array(n).fill(0));letzeroRowNum=Array(m).fill(0);// 行0的个数letzeroColNum=Array(n).fill(0);// 列0的个数for(leti=0;i<m;i++){letrow=lines[i+1].split(' ').map(Number);for(letj=0;j<n;j++){grid[i][j]=row[j];if(row[j]===0){zeroRowNum[i]++;zeroColNum[j]++;}}}// 计算满足条件的行和列letrowResCount=zeroRowNum.filter(x=>x>=Math.floor(n/2)).length;letcolResCount=zeroColNum.filter(x=>x>=Math.floor(m/2)).length;console.log(rowResCount);console.log(colResCount);});

Go

packagemainimport("fmt")funcmain(){varm,nintfmt.Scan(&m,&n)grid:=make([][]int,m)zeroRowNum:=make([]int,m)// 行0的个数zeroColNum:=make([]int,n)// 列0的个数fori:=0;i<m;i++{grid[i]=make([]int,n)forj:=0;j<n;j++{fmt.Scan(&grid[i][j])ifgrid[i][j]==0{zeroRowNum[i]++zeroColNum[j]++}}}// 计算满足条件的行和列rowResCount,colResCount:=0,0fori:=0;i<m;i++{ifzeroRowNum[i]>=n/2{rowResCount++}}fori:=0;i<n;i++{ifzeroColNum[i]>=m/2{colResCount++}}fmt.Println(rowResCount)fmt.Println(colResCount)}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/25 6:20:22

【time-rs】Duration 结构体详解

这是一个 Rust 时间库中的 Duration 结构体实现&#xff0c;提供高精度的时间跨度表示。 1. 主要特性 纳秒级精度&#xff1a;由整秒和纳秒部分组成支持负值&#xff1a;与标准库的 std::time::Duration 不同&#xff0c;支持负时间间隔安全边界检查&#xff1a;使用 RangedI32…

作者头像 李华
网站建设 2026/5/25 11:47:59

10398_基于SSM的教学评价管理系统

1、项目包含项目源码、项目文档、数据库脚本、软件工具等资料&#xff1b;带你从零开始部署运行本套系统。2、项目介绍教学评价系统是以Java平台作为开发环境&#xff0c;采用MySQL数据库作为后台&#xff0c;使用Eclipse作为开发工具进行设计。本系统主要实现了教学评价模块、…

作者头像 李华
网站建设 2026/5/26 4:17:43

Go语言变量

Go变量声明的核心机制 静态类型语言要求变量在使用前必须声明&#xff0c;明确内存边界。Go作为静态语言&#xff0c;通过变量声明实现这一机制&#xff1a; 变量绑定特定内存区域&#xff0c;类型信息确定操作边界声明形式为&#xff1a;var 变量名 类型 值未显式初始化时自动…

作者头像 李华
网站建设 2026/5/26 4:37:41

【高可用系统架构】

系统高可用实现手段 冗余与无单点设计 部署关键节点时避免单点故障&#xff0c;例如负载均衡采用双节点Keepalived方案&#xff08;如Nginx/HAProxy/LVS&#xff09;&#xff0c;通过虚拟IP实现故障自动切换。网络通信配置多线路&#xff08;如移动电信双线&#xff09;&#x…

作者头像 李华
网站建设 2026/5/26 5:14:18

高频软件测试基础面试题

在软件测试的面试过程中&#xff0c;面试官会问些基础的软件测试知识&#xff0c;下面为大家整理了一些高频软件测试面试必备的基础题&#xff0c;拿走不谢~ 一、什么是软件测试 为了发现程序中的错误而执行程序的过程。 二、软件测试的原则 1、完全测试程序是不可能的 2、…

作者头像 李华
网站建设 2026/5/26 5:14:19

如何准确判断json文件并且拿到我想要的信息

写在前面&#xff0c;自从发现拿到json解析后的文件中有我们想要的信息后&#xff0c;我稍微有点迷上这种方法&#xff0c;但是拿到内容后要怎么拿到想要的信息呢&#xff0c;字典列表相互嵌套&#xff0c;我头都晕了方法&#xff1a;首先就是把json解析后的文本保存成.json的形…

作者头像 李华