一、题目描述
给定一个仅包含0和1的N*N的二维矩阵,请计算二维矩阵的最大值。
计算规则如下:
1、每行元素按下标顺序组成一个二进制数(下标越大越排在低位),二进制数的值就是该行的值。矩阵各行值之和为矩阵的值。
2、允许通过向左或向右整体循环移动每行元素来改变各元素在行中的位置。
比如:
[1,0,1,1,1]向右整体循环移动2位变为[1,1,1,0,1],二进制数为11101,值为29。
[1,1,0,1,1]向右整体循环移动2位变为[1,1,1,1,0],二进制数为11110,值为30。
二、输入描述
1、第一行输入一个正整数,记录N的大小。
2、接下来的N行输入二维矩阵信息,行内元素逗号隔开。
三、输出描述
矩阵的最大值。
四、解题思路
本题的核心思路就是:
1、遍历整个二位矩阵,通过右移的方式,找到当前行的最大值;
2、通过substring拼接的方式实现右移;
详细的解题思路:
- 第一行输入一个数字N,表示N*N的二维矩阵的大小;
- 接下来的N行输入,N行输入二维矩阵信息,行内元素逗号隔开;
- 以行为单位,遍历整个二维矩阵;
- 遍历二维矩阵的每一行数据,找到右移后,当前行的最大值;
- 将每一行的最大值累加,得到矩阵的最大值;
送分题,大家一定要稳定把握。
五、Java算法源码
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// N*N的二维矩阵的大小
int N = Integer.valueOf(sc.nextLine());
// 矩阵的最大值
int maxCount = 0;
// 以行为单位,遍历整个二维矩阵
for (int i = 0; i < N; i++) {
String str = sc.nextLine().replace(",", "");
// 每一行数据的最大值
int max = 0;
// 遍历二维矩阵的每一行数据,找到右移后,当前行的最大值
for (int j = 0; j < N; j++) {
// 找到右移后,当前行的最大值
String temp = str.substring(j) + str.substring(0, j);
max = Math.max(max, Integer.valueOf(temp, 2));
}
System.out.println("找到右移后,当前行的最大值:" + max);
maxCount += max;
}
System.out.println("矩阵的最大值:" + maxCount);
}
六、效果展示
1、输入
6
1,1,1,0,1
0,1,0,0,1
1,1,0,1,0
0,0,0,1,1
1,0,1,0,0
0,0,1,0,0
2、输出
136
3、说明
- 1,1,1,0,1右移一位,变为11110,10进制为30;
- 0,1,0,0,1右移一位,变为10100,10进制为20;
- 1,1,0,1,0不用右移,变为11010即为最大值,10进制为26;
- 0,0,0,1,1右移一位,变为11100,10进制为24;
- 1,0,1,0,0右移一位,变为10100,10进制为20;
- 0,0,1,0,0右移一位,变为10000,10进制为16;
加一起30 + 20 + 26 + 24 + 20 + 16 = 136,得到矩阵的最大值136。
🏆下一篇:华为OD机试真题 Java 实现【跳房子II】【2023 B卷 100分】,附详细解题思路
🏆本文收录于,华为OD机试(JAVA)(2022&2023)
每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,可加入华为OD刷题群(私信即可),发现新题目,随时更新,全天CSDN在线答疑。