一、题目描述
如果矩阵中的许多系数都为零,那么该矩阵就是稀疏的。对稀疏现象有兴趣是因为它的开发可以带来巨大的计算节省,并且在许多大的实践中都会出现矩阵稀疏的问题。
给定一个矩阵,现在需要逐行和逐列地扫描矩阵,如果某一行或者某一列内,存在连续出现的0的个数超过了行宽或者列宽的一半,则认为该行或者该列是稀疏的。
二、输入描述
第一行输入两个数,分别为M和N
接下来M行输入为矩阵的成员,每行N个成员,矩阵成员都是整数,范围-32768~32767
。
三、输出描述
输出两行,第一行表示稀疏行的个数,第二行表示稀疏列的个数。
四、解题思路
- 先将数据加入到正矩阵和倒矩阵;
- 遍历正矩阵
- 如果当前值不是最后一个,且当前值为0,下一个值也是0,则符合稀疏数组,稀疏行的个数+1,跳出循环;
- 如果当前值是最后一个,且当前值为0,如果前一个值也是0,则符合稀疏数组,稀疏行的个数+1,跳出循环;
- 输出稀疏行的个数;
- 遍历倒矩阵;
- 如果当前值不是最后一个,且当前值为0,下一个值也是0,则符合稀疏数组,稀疏列的个数+1,跳出循环;
- 如果当前值是最后一个,且当前值为0,如果前一个值也是0,则符合稀疏数组,稀疏列的个数+1,跳出循环
- 输出稀疏列的个数;
五、Java算法源码
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 行的数量
int M = sc.nextInt();
// 列的数量
int N = sc.nextInt();
// 正矩阵(行是行,列是列)
int[][] rowArr = new int[M][N];
// 倒矩阵(行是列,列是行)
int[][] colArr = new int[N][M];
// 将数据加入到正矩阵和倒矩阵
for (int i = 0; i < M; i++) {
for (int j = 0; j < N; j++) {
int n = sc.nextInt();
rowArr[i][j] = n;
colArr[j][i] = n;
}
}
// 稀疏行的个数
int rowCount = 0;
// 行数M,列数N
for (int i = 0; i < M; i++) {
for (int j = 0; j < N; j++) {
// 如果当前值不是最后一个,且当前值为0,下一个值也是0,则符合稀疏数组,稀疏行的个数+1,跳出循环
if (j + 1 < N && rowArr[i][j] == 0 && rowArr[i][j + 1] == 0) {
rowCount++;
break;
}
// 如果当前值是最后一个,且当前值为0,如果前一个值也是0,则符合稀疏数组,稀疏行的个数+1,跳出循环
if (j + 1 == N && rowArr[i][j] == 0 && rowArr[i][j - 1] == 0) {
rowCount++;
break;
}
}
}
System.out.println("存在连续0的行数:" + rowCount);
// 稀疏列的个数
int colCount = 0;
// 行数M,列数N
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
// 如果当前值不是最后一个,且当前值为0,下一个值也是0,则符合稀疏数组,稀疏列的个数+1,跳出循环
if (j + 1 < M && colArr[i][j] == 0 && colArr[i][j + 1] == 0) {
colCount++;
break;
}
// 如果当前值是最后一个,且当前值为0,如果前一个值也是0,则符合稀疏数组,稀疏列的个数+1,跳出循环
if (j + 1 == M && colArr[i][j] == 0 && colArr[i][j - 1] == 0) {
colCount++;
break;
}
}
}
System.out.println("存在连续0的列数:" + colCount);
}
六、效果展示
1、输入
6 5
1 1 0 1 1
0 1 0 1 0
1 0 0 1 1
1 0 1 0 0
0 1 1 0 1
1 0 0 1 0
2、输出
3
3
3、说明
符合要求的行是:第三行1 0 0 1 1、第四行1 0 1 0 0、第六行1 0 0 1 0,共3行。
符合要求的列是:第二列1 1 0 0 1 0、第三列0 0 0 1 1 0、第四列1 1 1 0 0 1,共3列。
🏆下一篇:华为OD机试真题 Java 实现【跳房子II】【2023 B卷 100分】,附详细解题思路
🏆本文收录于,华为OD机试(JAVA)(2022&2023)
每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,可加入华为OD刷题群(私信即可),发现新题目,随时更新,全天CSDN在线答疑。