华为上机真题 2022矩阵最大值
Posted Linux猿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了华为上机真题 2022矩阵最大值相关的知识,希望对你有一定的参考价值。
🎈 作者:Linux猿
🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊!
🎈 关注专栏: 数据结构和算法成神路【精讲】优质好文持续更新中……🚀🚀🚀
🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬
目录
注意:题目来源于网络用户分享,本文仅分享做题思路和方法,如有侵权请联系我删除!
本题为求解矩阵最大值,满分 100 分。
一、题目描述
给定一个仅包含 0 和 1 的 N*N 二维矩阵,请计算二维矩阵的最大值,计算规则如下:
每行元素按下标顺序组成一个二进制数(下标越大越排在低位),二进制数的值就是该行的值。矩阵各行值之和为矩阵的值。
允许通过向左或向右整体循环移动每行元素来改变各元素在行中的位置。 比如: [1,0,1,1,1] 向右整体循环移动 2 位变为 [1,1,1,0,1],二进制数为11101,值为29。
[1,0,1,1,1] 向左整体循环移动 2 位变为 [1,1,1,1,0],二进制数为 11110,值为 30。
1.1 输入描述
输入的第一行为正整数,记录了 N 的大小,0 < N <= 20。
输入的第 2 到 N+1 行为二维矩阵信息,行内元素半角逗号分隔。
1.2 输出描述
矩阵的最大值。
1.3 示例
输入
5
1,0,0,0,1
0,0,0,1,1
0,1,0,1,0
1,0,0,1,1
1,0,1,0,1
输出
122
说明:第一行向右整体循环移动一位,得到最大值 11000 24,因此最大122。
🔶🔶🔶🔶🔶 我是华丽的分割线 🔶🔶🔶🔶🔶
二、解题思路
本题可以直接模拟每行矩阵的移动,每移动一次计算一次值,记录最大值,最后求所有行的最大值的和。
如上图所示,第一行依次移动后最大值为 24,第二行为 24,第三行为 20,第四行为 28,第五行为 26,总和为 122。
🔶🔶🔶🔶🔶 我是华丽的分割线 🔶🔶🔶🔶🔶
三、代码实现
代码实现如下所示。
#include <iostream>
using namespace std;
/**
* 题目:矩阵最大值
*/
/**
* 每移动一次计算一个值
*/
int calculate(string str, int num)
int sum = 0;
int n = str.size();
for (int i = num; i < n; ++i)
sum = sum * 2;
if (str[i] == '1')
sum++;
for (int i = 0; i < num; ++i)
sum = sum * 2;
if (str[i] == '1')
sum++;
return sum;
/**
* 计算每行的最大值
*/
int solve(string str, int n)
string binary;
//先分隔出来数字,存储到 binary 中
for (int i = 0; i < (int)str.size(); ++i)
if (str[i] != ',')
binary += str[i];
// 移动 n 次,每次计算一个值,保留最大值
int maxValue = 0;
for (int i = 0; i < n; ++i)
maxValue = max(maxValue, calculate(binary, i));
return maxValue;
int main()
int n;
while (cin>>n)
int ans = 0;
string str;
for (int i = 0; i < n; ++i)
cin>>str;
ans += solve(str, n); // solve 求解每行的最大值
cout<<ans<<endl;
return 0;
🔶🔶🔶🔶🔶 我是华丽的分割线 🔶🔶🔶🔶🔶
四、时间复杂度
时间复杂度:O(n^2)
其中,n 表示有多少行,在上述代码中,矩阵中的每一行都循环移动,并记录最大值, 因为有 n 行,所以时间复杂度为 O(n^2)。
🎈 感觉有帮助记得「一键三连」支持下哦!有问题可在评论区留言💬,感谢大家的一路支持!🤞猿哥将持续输出「优质文章」回馈大家!🤞🌹🌹🌹🌹🌹🌹🤞
以上是关于华为上机真题 2022矩阵最大值的主要内容,如果未能解决你的问题,请参考以下文章