华为机考,华为笔试,软件类,2020年8月19日题目,超详细解答。

这次的题目根据身边同学反映普遍较难,仔细看了一下题目其实也并不难,因为都没有涉及比较复杂的算法,但是这次的题目都比较繁琐,写起来比较费时间。

题目一

题目描述:

已知有一堆人排成M行N列,(M,N均大于等于10小于等于1000),现在从这群人中挑选一些人出来。在这个M行N列的队伍中,每个人对应一个坐标,从最左上角的(0,0)到右下角的(M-1,N-1)。这些人还会进行一次报数,报数顺序是按照类似蜗牛壳形状的顺时针方向由外圈像内圈报数,当报数的个位数为7且十位数为奇数的人出列,按报数顺序输出这些人的坐标。
例如:如下图所示一个5行5列的队伍,按顺时针顺序从外到里报数,其中17满足条件,因此需要输出17的坐标(1,1)

输入和输出格式:
输入为行数M和列数N

10 10

输出为满足条件的坐标:

[[7,9],[1,1],[8,2],[7,5],[4,4]]

要注意输出时候有个坑,前面几组输出坐标后还会输出一个逗号分隔,最后一组坐标之后不输出逗号,因此需要把最后一个满足条件的坐标找出来,输出得时候不输出逗号。

第一题思路

思路比较清晰,就是先创建一个M行N列纯0的数组,然后按照这个顺时针的顺序走一遍下来,并给每个坐标位置赋值(值为这个位置报数号)。然后把满足出列条件的报数的坐标输出即可。按照顺序走的时候需要按照以下的顺序来走:

  1. 如果该坐标的左边和上边位置已经报过数,且右边位置还未报数,则该位置报数之后向右继续报数。
  2. 如果该坐标的右边和上边位置已经报过数,且下边位置还未报数,则该位置报数之后向下继续报数。
  3. 如果该坐标的右边和下边位置已经报过数,且左边位置还未报数,则该位置报数之后向下继续报数。
  4. 如果该坐标的左边和下边位置已经报过数,且上边位置还未报数,则该位置报数之后向上继续报数。
    上面报数的意思其实就是给二维数组赋值的过程,需要注意的是首先要先把最外圈的报数完,因为在进行判断的时候会查询这些坐标相邻外圈元素的状态,如果不先把最外圈的报数,在后面访问时数组会越界。

第一题代码

#include<iostream>
using namespace std;
int main()
{int M,N;cin >> M >> N;int sum0=M*N;//从后往前找找最后一个满足条件的计数。while(sum0>0){int r1 = sum0 % 100;int x1 = r1 % 10;r1 = r1 / 10;int x2 = r1;if(x1==7&&x2%2==1)break;sum0--;//sum0此时为最后一个满足条件的计数}int a[M][N];for (int i0 = 0; i0 < M; i0++)for (int j0 = 0; j0 < N; j0++)a[i0][j0] = 0;int count = 1;int i = 0, j = 0;cout << '[';while (a[i][j] == 0){a[i][j] = count;count++;int s0 = a[i][j];int r0=s0%100;//除以100的余数为后两位数,用r0记录。int y1 = r0 % 10;//y1为个位数r0 = r0 / 10;int y2 = r0;//y2为十位数if(y1==7&&y2%2==1)//满足条件的计数进行输出{cout << '[' << i << ',' << j << ']';if(a[i][j]!=sum0)//最后一个复合条件的报数输出的时候单独处理,不带逗号。cout << ',';}if (i == 0 && j < N - 1)//先把最外圈的进行报数j++;else if (i == 0 && j == N - 1)i++;else if (i < M - 1 && j == N - 1)i++;else if (i == M - 1 && j == N - 1)j--;else if (i == M - 1 && j > 0)j--;else if (i == M - 1 && j == 0)i--;else if (i > 1 && j == 0)i-- ;else if (i == 1 && j == 0)j++;//开始内圈报数;else if (a[i - 1][j]>0 && a[i][j - 1]>0 && a[i][j + 1] == 0)j++;else if (a[i - 1][j]>0 && a[i][j + 1]>0 && a[i + 1][j] == 0)i++;else if (a[i + 1][j]>0 && a[i][j + 1]>0 && a[i][j - 1] == 0)j--;else if (a[i +1][j]>0 && a[i][j - 1]>0 && a[i - 1][j] == 0)i--;}cout << ']';return 0;
}

运行结果:
在这里插入图片描述
调试过程中记录队伍报数编号的矩阵:
在这里插入图片描述

题目二

题目描述

给定二叉树每个节点的深度,计算多少种满足条件的二叉树。根节点深度为0.
输入描述:
第一行为一个整数N,表示二叉树节点的数量,在1到1000之间。
第二行为N个整数,d1,d2,……dN表示每个节点的深度。
输出描述:
输出为满足条件的二叉树数量。由于结果可能非常大,因此输出为实际结果除以(10^9+7)之后的余数。
例:
输入:

4
1 0 2 2

输出:

2

例子解读:
上面的输入表示深度为1的节点有一个,深度为0的节点有一个,深度为2的节点有两个。对应的两种二叉树的形状如下图所示:由答案为2可以知道该题目不区分元素的不同,只根据二叉树的形状进行分类。如果考虑元素分布的话,下图中D2-1和D2-2交换位置则又多了一倍的种类,因此此题目只考虑多少种形状的二叉树即可,即只考虑组合不考虑排列。
在这里插入图片描述

第二题思路

该题如果高中排列组合学的比较好的话应该比较容易想到思路,理清了数学关系这道题目就很简单了。
首先要根据输入把二叉树每层多少个节点数目统计好。例如D0,D1,D2……DN分别表示第0层,1层,……N层的节点数目。对于第i层,该层有Di个节点,则第i+1层有2Di个位置,因此需要从2Di个位置中选D(i+1)个位置进行放置,则放置方法有在这里插入图片描述
种。然后把所有层的放置方法数全部乘起来就得到最后总的不同形状二叉树数量。
如上面的例子:第0 1 2层的节点数为1 1 2.因此对于第一层,有2个位置选一个有2种选取方法,对于第2层,从2个位置选两个有1种选择方法,因此总方法有2*1=2种方法,也就是两种不同形状的二叉树。

第二题代码

#include<iostream>
#include<math.h>
using namespace std;int zuhe(int m, int n)//定义计算组合数的函数//组合数计算公式:m个里面选n个,结果为m!/((m-n)!n!)=(m*(m-1)*...(m-n+1))/(n*(n-1)*...1);//使用(m*(m-1)*...(m-n+1))/(n*(n-1)*...1)计算比m!/((m-n)!n!)能节省较多的运算量。{int m0 = 1, n0 = 1;//m0,n0表示组合数计算中的分子和分母。for (int i = 0; i < n;i++){m0 = m0 * (m - i);n0 = n0 * (n - i);}return m0 / n0;}
int main()
{int N;cin >> N;int di;int a[N] = {0};//用a[N]来记录每层的节点个数,初始化为0,后面每输入一个在对应的层数加1.int depth = 0;//depth记录二叉树深度(层数),N个节点的二叉树深度小于N,for (int i = 0; i < N;i++){cin >> di;a[di]++;if(di>depth)depth = di;}long long count = 1;//记录总方法数,为二叉树各层组合数的乘积。结果可能比较大,使用longlong类型。int cmn;for (int i = 1; i <= depth;i++){cmn = zuhe(2 * a[i - 1], a[i]);//调用组合函数计算每层有多少种组合方法。count = count * cmn;}int r0 = pow(10, 9) + 7;//pow默认返回值为double,这里转为int类型方便下面求余运算。int ans=count%r0;cout << ans;return 0;
}

运行结果:
在这里插入图片描述
在这里插入图片描述

题目三

题目描述

俄罗斯方块,输入有两个字符串,第一个frame表示当前底座状态,第二个brick表示下落方块的状态,下落的方块只能左右移动不会旋转。方块落下后如果一行全部充满则会消失,最后求最少还剩多少行。输入的底座和方块都不超过9列,即最大只有9列。
例如:
输入为:

2122
121

底座和方块状态如下图所示:其中2122表示当前底座状态,都是底对齐的,而121表示下落方块的状态,都是顶对齐的,即2的位置的突出是往下凸而不是往上凸。下图运行结果为1,下图中方块左右移动有两种下落方式,一种如下图所示,下落后会消去两行最后剩余1行。另外一种下落方式是向又移动一格然后再下落,最后消去一行剩余3行,因此最少的结果是剩余1行,输出为1
输出为:

1

在这里插入图片描述

第三题思路

该题思路非常简单,把方块从左到右依次落下并记录剩余的行数,取行数最小的输出。但写起来较为繁琐,关键是如何表示方块。可以用一个二维数组来表示。如上面的例子,共有两种下落方法,一种是靠左边,此时将各列相加可得到3332.

121
2122
3332

注意方块下落所在的三列,高度都为3,和方块的顶对齐保持一致。说明这些列下方没有空格。如下图所示:
在这里插入图片描述
而靠右边下落的情况,将各列相加得2243。

121
2122
2243

注意方块下落所在的三列高度分别为243,不满足方块的顶部对齐条件。因此除了高度最高的那列之外,剩下的俩列都有空格,高度为2的有两个空格,高度为3的有一个空格。如下图所示:在处理中需要特别注意。另外输入的是字符串,需要把每个单独转化为数字处理。
在这里插入图片描述

第三题代码

#include<iostream>
#include<string>
using namespace std;
int main()
{string frame;string brick;cin >> frame>>brick;//输入底座和掉落的方块。int framelen = frame.size();//求底座列数int bricklen = brick.size();//求方块列数int leftmin = 10000;//表示剩余最小行数,初始为一个较大的数。int frame0[framelen], brick0[bricklen];//将输入的字符串转为数字保存到整型数组中。for (int i = 0; i < framelen;i++)frame0[i] = frame[i] - '0';//因为列数小于9,减去0的ascii值即可将字符串转为响应的数字。for (int i = 0; i < bricklen;i++)brick0[i] = brick[i] - '0';int num = framelen - bricklen + 1;//左右移动方块共有num种掉落方法。for (int i = 0; i < num;i++){int frameadd[framelen];for (int j = 0; j < framelen;j++)frameadd[j] = frame0[j];int height = 0;for (int j = i; j < i + bricklen; j++){frameadd[j] = frameadd[j] + brick0[j-i];if(frameadd[j]>height)height = frameadd[j];//height记录方块所在列的最高高度。}int framefin[framelen][height];//使用二维数组framefin记录方块下落后的状态。for (int j1 = 0; j1 < framelen;j1++)for (int j2 = 0; j2 < height;j2++)framefin[j1][j2] = 0;//先初始为全0;for (int j1 = 0; j1 < framelen;j1++)for (int j2 = 0; j2 < frame0[j1];j2++)framefin[j1][j2] = 1;//先把下落前的底座用1填充。for (int j1 = i; j1 < i + bricklen;j1++){  int num0 = height - frameadd[j1];//num0记录砖块和基座之间的空格数目。for (int j2 = frame0[j1] + num0; j2 < height;j2++)framefin[j1][j2] = 1;//跳过空格然后再填充1,空格数为最高的高度减去当前列高度。}//下面进行判断消去的多少行,每消去一行height-1,最后剩余的行数为height。int height0 = height;for (int j2 = 0; j2 < height0;j2++)//这个地方单独定义一个height0控制循环次数,因为height在循环体内会改变,如果还要用height,循环次数会变化。{int flag = 1;//如果j1行不全为1,则改变flag的值。for (int j1 = 0; j1 < framelen;j1++){if(framefin[j1][j2]==0){flag = 0;break;}}if(flag==1)//如果flag未改变,则表明这一行全为1,则消去一行height--;}if(height<leftmin)leftmin = height;//legtmin记录最小行数。}cout << leftmin;return 0;
}
}

运行结果:
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/22772.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为HCIP-DATACOM题库解析(821)61-79

61.当两台优先级相同的设备同时竞争Master角色时&#xff0c;则IP地址较小的接口所在的设备应当被选为Master设备 错误 解析&#xff1a;当两台优先级相同的设备同时竞争Master角色时&#xff0c;则IP地址较大的接口所在的设备应当被选为Master设备 62.VRRP的接口IP地址和虚拟…

华为HCIP-DATACOM题库解析21-30(821)

1、下面那些策略或工具不能够应用于ospf A:access-list B:prefix-list C:route-policy D:as-path filter 解析&#xff1a;as-path filter命令用来创建as路径过滤器&#xff0c;ospf属于igp协议&#xff0c;不涉及到as号。 2、某企业大楼有大量员工&#xff0c;通常都在上…

华为数通HCIA考试高分指导(含全套题库)

华为认证考试600分就能上岸拿证&#xff0c;考试并不难。今天将从6大重要考点考题分析&#xff0c;帮助大家高峰通过HCIA考试。 想要HCIA考试通过并获得高分&#xff0c;必须掌握以下6大板块&#xff1a; 1、选举规则汇总&#xff08;易混淆考点&#xff09; 2、三大设备详解&a…

2021亚太杯数学建模竞赛

亚太杯数学建模竞赛 数据类型题涉及的知识点及基本模型讲解 本人曾参加亚太杯四次&#xff0c;三次都是 First Prize&#xff0c;其中有一次因中途电脑烧坏了就暂停编写建模论文因而拿了Second Prize&#xff1b;我们立足当前&#xff0c;着眼长远&#xff0c;按照社会价值导…

2019年华中杯数学建模B题数据处理代码

在5月一号晚上&#xff0c;我参加了华中杯数学建模。对于数据处理&#xff0c;我用到了下面代码&#xff0c;希望能帮助到大家。 myDivision.py文件&#xff0c;用于对附件一的数据进行划分&#xff1a; import pandas as pd #分析excel表格 import matplotlib.pyplot as plt…

2021 年第十一届 MathorCup 高校数学建模挑战赛A题分析

2021 年第十一届 MathorCup 高校数学建模挑战赛A题分析 题目&#xff1a;自动驾驶中的车辆调头问题问题分析前言综述问题一分析问题二分析问题三分析问题四分析问题五分析问题六分析 题目&#xff1a;自动驾驶中的车辆调头问题 自动驾驶是近年人工智能应用的热门研究领域之一&…

【数学建模】2018年数学建模国赛C题解答 基于RFMT 模型的百货商场会员画像描绘

文章目录 问题一问题二求出RFM数据评分K- Means聚类 问题三问题四问题五参考文献 问题一 利用该大型百货商场提供的附件一中的会员信息以及附件三中的会员消费明细&#xff0c;完善该商场的会员画像。本文从购买力、购买时间偏好两个维度分析会员的消费特征。以会员消费总金额…

2022年华中杯数学建模挑战赛B题量化投资问题求解全过程文档及程序

2022年华中杯数学建模 B题 量化投资问题 原题再现&#xff1a; 量化投资是指通过数量化方式及计算机程序化发出买卖指令&#xff0c;以获取稳定收益为目的的交易方式。投资者通过数据分析探索市场运行规律&#xff0c;并预测市场走势&#xff0c;从而进行决策交易。随着大数据…

【数模国赛参赛情况浅析】

今天给大家带来近几年的国赛参赛以及国奖评阅等情况。由于19年开始国赛才新增C题&#xff08;据说是鼓励数学学得较浅的文商科等专业学生参加&#xff09;&#xff0c;因此我们从19年开始对19-21年的参赛数据进行浅析。 •参赛规模 19-20&#xff1a; 21&#xff1a; 2021数模…

2022年第三届MathorCup高校数学建模挑战赛——大数据竞赛

&#xff08;1&#xff09;2022年11月1日-12月20日 报名阶段 &#xff08;2&#xff09;2022年12月20日18:00至2023年1月19日20:00&#xff0c;初赛阶段 &#xff08;3&#xff09;2023年3月6日18:00-2023年3月13日20:00&#xff0c;复赛阶段 关注我&#xff0c;后续分享数学…

2022MathorCup高校数模挑战赛D题思路

D 题 移动通信网络站址规划和区域聚类问题 目录背景阐述问题 1描述解题思路 问题 2描述解题思路 问题 3描述解题思路 结语 今年D题应该选择的人比较多&#xff0c;是典型的目标优化类题目。这道题难度简单一点&#xff0c;估计很多同学都会选这道题&#xff0c;当然拿奖也会难一…

数模比赛经验分享(美赛分享)

目录 队员寻找 队员任务分配 赛前准备 知识准备 模拟赛 相互监督 每个阶段的主要任务 学习阶段 论文研读阶段 实践阶段 改进阶段 比赛注意事项 有用的资源分享 数模学习 数据网站 画图工具 祝愿 队员寻找 对于队员的要求&#xff0c;我认为只要一个特点就行…

2020年MathorCup高校数学建模挑战赛—大数据竞赛A题移动通信基站流量预测求解全过程文档及程序

2020年MathorCup高校数学建模挑战赛—大数据竞赛 A题 移动通信基站流量预测 原题再现&#xff1a; 随着移动通信技术的发展&#xff0c;4G、5G 给人们带来了极大便利。移动互联网的飞速发展&#xff0c;使得移动流量呈现爆炸式增长&#xff0c;从而基站的流量负荷问题变得越来…

数模美赛分享(时间安排+获奖技巧+比赛思路)

数模美赛分享&#xff08;时间安排获奖技巧比赛思路数模分工&#xff09; 本贴所有内容全部干货&#xff0c;时间有限&#xff0c;先简单分享一下&#xff0c;深入学习&#xff0c;请见附录b站视频 一、 时间安排 二、获奖技巧 三、 比赛思路 四、 数模分工 三个人分工如下&…

2023年MathorCup数模A题赛题

A 题 量子计算机在信用评分卡组合优化中的应用 在银行信用卡或相关的贷款等业务中&#xff0c;对客户授信之前&#xff0c;需要先通过 各种审核规则对客户的信用等级进行评定&#xff0c;通过评定后的客户才能获得信 用或贷款资格。规则审核过程实际是经过一重或者多重组合规则…

2022 年 MathorCup 高校数学建模挑战赛——大数据竞赛(北京移动用户体验影响因素研究全套代码)

赛道 B&#xff1a;北京移动用户体验影响因素研究 移动通信技术飞速发展&#xff0c;给人们带来了极大便利&#xff0c;人们也越来越离不开移动通信技术带来的各种便捷。随着网络不断的建设&#xff0c;网络覆盖越来越完善。各个移动运营商&#xff0c;越来越重视客户的网络使…

2023年MathorCup数模C题赛题

C 题 电商物流网络包裹应急调运与结构优化问题 问题C&#xff0c;题目的设置就是本科生专科生选题&#xff0c;因此在题目难度上应该会和AB&#xff0c;有明显的区别。整个问题的设置还是很符合妈杯的风格设置&#xff0c;下面我们简要的看一下各个题目设置。 问题 1&#xff1…

【数模研赛】“华为杯”第十九届中国研究生数学建模竞赛C题分享——(四)问题二模型建立

写在前面&#xff1a; 第十九届数模研赛在22年10月6-10日开展&#xff0c;我和我的两名队友肝了5天&#xff0c;整出来一篇论文。因为不确定自己做的好不好&#xff0c;所以一直没写博客。前两天结果出来了&#xff0c;我们队拿了国二&#xff0c;在C题里排名88/1134&#xff0…

8月的数模比赛,适合小白为国赛热热身,可以报名了!

​经常有同学在交流群问&#xff1a;小白怎么入门&#xff1f;该从什么学起&#xff1f; 在入门指导的文章中曾讲过&#xff1a;实战是最好的学习。直接参赛&#xff0c;遇到不会的就去搜、去翻书&#xff0c;现学现用&#xff0c;多做几次比赛就入门了。 现在8月份的华数杯已…

2019-12-02 校内数模新手赛

调查地铁站的路径选择问题 摘要 对于一二线城市&#xff0c;地铁已成为民众不可或缺的出行方式&#xff0c;为了减少在上班上学路上消耗的时间&#xff0c;人们也可谓绞尽脑汁。这次&#xff0c;我们要帮助p同学&#xff0c;在他解决地铁"最佳门"问题时提供耗时最短…