【华为机试题】华为机试真题附解答(2020.9.16/c++)
第一题题目描述
五键键盘只可以输入a、ctrl+c、ctrl+x、ctrl+v、ctrl+a,对应的功能为
a:输出到屏幕上a字母
ctrl+c:复制选定内容到剪贴板
ctrl+x:复制选定内容到剪贴板并且清空当前选定内容
ctrl+v:将剪贴板的内容输出到屏幕
ctrl+a:选定屏幕上所有内容
现在依次用1,2,3,4,5来代表相应操作, 输入数字代表相应操作,输出操作后屏幕上应该有的字母数量。
输入输出示例:
输入 1 1 5 3 2 输出 0
输入 1 1 5 3 4 1 输出 3
思路分析:
注意ctrl+a出现的情况,因为输入字母a,ctrl+c,ctrl+x和ctrl+v的结果都要受到是否全选的影响。
对每一步的操作结果都进行至少一步的存储,所以不一定是直接开辟3100的三维数组,只需要一个32的三维数组就可以完成整个操作,类似于用数组实现循环队列。
#include <iostream>
using namespace std;
int main()
{int arr[3][100];//arr[0][]存储输入的操作,arr[1][]存储输入操作后屏幕上的字母数,arr[2][]存储输入操作后剪贴板上的字母数int i = 0;//读取一行操作数while (cin >> arr[0][i]) {if (arr[0][i] == 1)//输入a字母{if (i == 0)//字母数初始化{arr[1][i] = 1;arr[2][i] = 0;}else if (arr[0][i - 1] == 5)//有ctrl+a时的情况{arr[1][i] = 1;arr[2][i] = arr[2][i - 1];}else//无ctrl+a时的情况{arr[1][i] = 1 + arr[1][i - 1];arr[2][i] = arr[2][i - 1];}}else if (arr[0][i] == 2)//输入ctrl+c时{if (i == 0){arr[1][i] = 0;arr[2][i] = 0;}else if (arr[0][i - 1] == 5){arr[1][i] = arr[1][i - 1];arr[2][i] = arr[1][i - 1];//有ctrl+a时剪贴板字母数变为上一步屏幕字母数}else{arr[1][i] = arr[1][i - 1];arr[2][i] = 0;//无ctrl+a时剪贴板字母数变为0}}else if (arr[0][i] == 3)//输入ctrl+x时{if (i == 0){arr[1][i] = 0;arr[2][i] = 0;}else if (arr[0][i - 1] == 5){arr[1][i] = 0;//屏幕字母数清零arr[2][i] = arr[1][i - 1];//有ctrl+a时剪贴板字母数变为上一步屏幕字母数}else{arr[1][i] = arr[1][i - 1];arr[2][i] = 0;//无ctrl+a时剪贴板字母数变为0}}else if (arr[0][i] == 4)//输入ctrl+v时{if (i == 0){arr[1][i] = 0;arr[2][i] = 0;}else if (arr[0][i - 1] == 5){arr[1][i] = arr[2][i - 1];//有ctrl+a时屏幕字母数变为上一步剪贴板字母数arr[2][i] = arr[2][i - 1];}else{arr[1][i] = arr[1][i - 1] + arr[2][i - 1];arr[2][i] = arr[2][i - 1];}}else if (arr[0][i] == 5)//输入ctrl+a时{if (i == 0){arr[1][i] = 0;arr[2][i] = 0;}else//输入ctrl+a时以下字母数均不变{arr[1][i] = arr[1][i - 1];arr[2][i] = arr[2][i - 1];}}i++;}//输出结果cout << arr[1][i - 1];return 0;
}
第二题题目描述
输入数组长度length>3,输入一组数据,其中有且仅有一组数据满足A=B+2C,求解各个值并且按照A,B,C的顺序输出,无解返回0。
(注意:A,B,C不能是同一个值,即地址相同且值也相同)输入1
4
7 3 0 2输出1
7 3 2输入2
3
0 0 1输出2
0
思路分析
思路一:分析可知,A必然是三者中的最大值,B和C则不确定谁打谁小,所以可以先将数组排序,再从最大值开始进行暴力求解,最大值设为A,其余的值进行排列组合找到解,所有组合都不符合的话就是无解,依次选择次大值作为A值,重复上述操作直到子数组变为只有三个元素。
思路二:同思路一将数组排序(升序),选择最大值作为A值,设两个指针B和C分别指向最小值和小于A的最大值,如果B+2C>A那么C指针左移,如果B+2C<A那么B指针右移,当某一指针移动到头还没有解,那么将A的指针左移一个位置重复上述操作即可。有解时直接输出结果结束程序(B和C不指向同一个数),不然直到子数组只有三个元素输出0结束程序。
//第二题
#include <iostream>
using namespace std;int main()
{int length;//定义数组长度cin >> length;int arr[100];//定义数组for (int i = 0; i < length; i++){cin >> arr[i];//数组输入}//对数组进行选择排序(升序)int temp;for (int i = 0; i < length; i++){temp = arr[i];for (int j = i; j < length; j++){if (temp > arr[j]){temp = arr[j];arr[j] = arr[i];arr[i]=temp;}}}//暴力破解法一/*int flag=0;for (int i=length-1;i>1;i--){for (int j = 0; j <= i-1; j++){for (int k=0;k<=i-1;k++){if ((arr[j] + 2 * arr[k] == arr[i])&&(j!=k)&&(flag==0)){cout << arr[i] << " " << arr[j] << " " << arr[k];flag = 1;}}}}*/
//指针解法二int flag = 0;//标志位,是否有解for (int i = length - 1; i > 1; i--)//有序数组从后向前确定A值{int pointB=0, pointC=i-1;//两个指针指向B和Cwhile ((pointB<i)&&(pointC>=0))//当指针满足条件时循环{if (arr[i] > arr[pointB] + 2 * arr[pointC])//A>B+2C时,B的指针右移pointB++;else if (arr[i] < arr[pointB] + 2 * arr[pointC])//A<B+2C时,C的指针左移pointC--;else if (arr[i] == arr[pointB] + 2 * arr[pointC]){if (pointB != pointC) //满足条件且B,C指针指向不是同一个地址时输出结果结束程序{cout << arr[i] << " " << arr[pointB] << " " << arr[pointC];return 1;}else//若指向同一地址,则将不会越界的指针对应加减{if (pointB < i - 1)pointB++;else if (pointC > 0)pointC--;}}}}//无满足条件的解时cout<<flag;return 0;
}
第三题题目描述
输入数组A和B,两数组包含元素数目相同,当A数组元素重新排列后,对应位置都大于B数组的组合种类有多少种?
输入输出示例:
输入:
4 6 2
1 3 5
输出: 1
输入:
7 6 2
1 3 5
输出: 2
思路分析:
输入数据后,找到B数组对应的数据在A数组中有几个值比前者大,例如B[1]在A数组中比3个数要小,那么我们把对应的结果存储在数组C中,即C[1]=3。C数组构建完成后,对C数组进行排序(升序)。
如果第一个数据为0,那么直接返回0,即不存在这样的组合。
否则进行计算
if(i==0),result=C[0];
else result*=(C[i]-i);
这里对计算式进行一个解释,在B数组中一个比较小的数b1和一个比较大的数b2相比,在A中会有更多的数比b1大,就是说c1>c2,c1里面包含了c2代表的数字,所以优先满足小的数先选择,大的数依次减少选择的可能数,例如c2*(c1-1)。
#include <iostream>
#include <vector>
#include <algorithm>using namespace std;
int main()
{int value;vector<int> A,B,C;//读入A数组数据cin >> value;A.push_back(value);while (cin.get() != '\n'){cin >> value;A.push_back(value);}//读入B数组数据cin >> value;B.push_back(value);while (cin.get() != '\n'){cin >> value;B.push_back(value);}//统计B数组所对应的每一项值在A数组中有几个值会大于该值for (int i = 0; i < B.size(); i++){int num = 0;for (int j = 0; j < A.size(); j++){if (B[i]<A[j]){num++;}}C.push_back(num);}//将结果进行排序sort(C.begin(),C.end());//排列组合计算结果if (C[0] == 0)cout << 0;else {int result=1;for (int i = 0; i < C.size(); i++){if (i == 0)result *= C[i];elseresult *= (C[i] - i);}cout << result;}return 0;
}
-----------------------------------------------------------------------------------------------------------------------------------------------------
如果本文对你有所帮助,请不要忘了点赞、收藏哦!!!
-----------------------------------------------------------------------------------------------------------------------------------------------------
【华为机试题】华为机试真题附解答(2020.9.16/c++)相关推荐
- 【华为机试真题 Python实现】2022年4、5月高频机试题
文章目录 2022年4.5月高频机试题 机试必须要会的函数 输入输出处理 for 循环 通过下标访问元素 直接迭代访问元素 同时访问下标和元素 while 循环 字符ASSIC码转换 进制转换 绝对值 ...
- 【华为机试真题 Python实现】2022年4季度最新机试题
文章目录 2022年4季度最新机试题 机试必须要会的函数 输入输出处理 for 循环 通过下标访问元素 直接迭代访问元素 同时访问下标和元素 while 循环 字符ASSIC码转换 进制转换 绝对值计 ...
- 【华为机试真题 Python实现】华为机试题整理(已更新211篇)
文章目录 杂文 华为机试真题系列 牛客网华为机试系列 文章发布时间和导航更新时间可能不同步,会尽快更新
- 【华为OD机试真题 python】连续出牌数量【2022 Q4 | 200分】
前言 <华为OD笔试真题 python> 专栏含华为OD机试真题.华为面试题.牛客网华为专栏真题. 如果您正在准备华为的面试,或者华为od的机会,有任何想了解的可以私信我进行交流.我会尽可 ...
- 【满分】【华为OD机试真题2023 JAVAJS】查找充电设备组合
华为OD机试真题,2023年度机试题库全覆盖,刷题指南点这里 查找充电设备组合 时间限制:5s 空间限制:256MB 限定语言:不限 题目描述: 某个充电站,可提供n个充电设备,每个充电设备均有对应的 ...
- 【满分】【华为OD机试真题2023 JAVAJS】查找重复代码
华为OD机试真题,2023年度机试题库全覆盖,刷题指南点这里 查找重复代码 时间限制:1s 空间限制:32MB 限定语言:不限 题目描述: 小明负责维护项目下的代码,需要查找出重复代码,用以支撑后续的 ...
- 【华为机试真题 Python实现】查找众数及中位数
文章目录 前言 题目描述 示例 1 示例 2 参考代码 前言 <华为机试真题>专栏含牛客网华为专栏.华为面经试题.华为OD机试真题. 如果您在准备华为的面试,期间有想了解的可以私信我,我会 ...
- 华为OD机试真题2023(JAVA)
华为机试题库已由2022版换为2023版 华为机试有三道题目,第一道和第二道属于简单或中等题,分值为100分,第三道为中等或困难题,分值为200分.总分为400分,150分钟考试时间.之前通过为150 ...
- 【华为OD机试真题2023 JAVA】不含101的数
华为OD机试真题,2023年度机试题库全覆盖,刷题指南点这里 不含101的数 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: 小明在学习二进制时,发现了一类不含101的数,也就是: ...
- 【华为机试真题详解】不含 101 的数【2022 Q4 | 100分】
文章目录 前言 题目描述 输入描述 输出描述 示例 1 示例2 题目解析 参考代码 前言 <华为机试真题详解 Python实现>专栏含牛客网华为专栏.华为面经试题.华为OD机试真题. 如果 ...
最新文章
- idea直连linux部署项目,idea项目打包和在linux的部署
- Flutter开发之Debug调试(十)
- Stanford UFLDL教程 白化
- html表单输入的文本框的值,网页设计关于表单输入框的技巧代码
- 对“粘连”footer布局的思考和总结
- redis相关(搭建和数据落盘)
- 云大计算机昆工,云南最好的7所大学,分3档!本地人青看中昆医大,外省更爱昆工!...
- JavaScript学习(七十一)—call、apply、bind学习总结
- 基于centos的FasfDFS安装配置
- Tomcat7与Tomcat8的差异详细对比
- ZigBee的应用场景
- 电脑重装系统苹果笔记本开不了机的解决措施有哪些
- 语音识别(五)——Mel-Frequency Analysis, FBank, 语音识别的评价指标, 声学模型进阶
- 4K网络视频下载器:4K Video Downloader mac汉化教程
- NVIDIA显卡驱动的安装失败
- 内网渗透建立代理通道(如何攻击目标内网机器?)-Socks代理(゚益゚メ) 渗透测试
- Android 仿微信图片选择器 PictureSelector3.0 的使用
- 托福阅读基础训练方法
- JQuery入门(1) - 选择器
- mysql数据库表锁、行锁