第一题题目描述

五键键盘只可以输入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

思路分析:

  1. 注意ctrl+a出现的情况,因为输入字母a,ctrl+c,ctrl+x和ctrl+v的结果都要受到是否全选的影响。

  2. 对每一步的操作结果都进行至少一步的存储,所以不一定是直接开辟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++)相关推荐

  1. 【华为机试真题 Python实现】2022年4、5月高频机试题

    文章目录 2022年4.5月高频机试题 机试必须要会的函数 输入输出处理 for 循环 通过下标访问元素 直接迭代访问元素 同时访问下标和元素 while 循环 字符ASSIC码转换 进制转换 绝对值 ...

  2. 【华为机试真题 Python实现】2022年4季度最新机试题

    文章目录 2022年4季度最新机试题 机试必须要会的函数 输入输出处理 for 循环 通过下标访问元素 直接迭代访问元素 同时访问下标和元素 while 循环 字符ASSIC码转换 进制转换 绝对值计 ...

  3. 【华为机试真题 Python实现】华为机试题整理(已更新211篇)

    文章目录 杂文 华为机试真题系列 牛客网华为机试系列 文章发布时间和导航更新时间可能不同步,会尽快更新

  4. 【华为OD机试真题 python】连续出牌数量【2022 Q4 | 200分】

    前言 <华为OD笔试真题 python> 专栏含华为OD机试真题.华为面试题.牛客网华为专栏真题. 如果您正在准备华为的面试,或者华为od的机会,有任何想了解的可以私信我进行交流.我会尽可 ...

  5. 【满分】【华为OD机试真题2023 JAVAJS】查找充电设备组合

    华为OD机试真题,2023年度机试题库全覆盖,刷题指南点这里 查找充电设备组合 时间限制:5s 空间限制:256MB 限定语言:不限 题目描述: 某个充电站,可提供n个充电设备,每个充电设备均有对应的 ...

  6. 【满分】【华为OD机试真题2023 JAVAJS】查找重复代码

    华为OD机试真题,2023年度机试题库全覆盖,刷题指南点这里 查找重复代码 时间限制:1s 空间限制:32MB 限定语言:不限 题目描述: 小明负责维护项目下的代码,需要查找出重复代码,用以支撑后续的 ...

  7. 【华为机试真题 Python实现】查找众数及中位数

    文章目录 前言 题目描述 示例 1 示例 2 参考代码 前言 <华为机试真题>专栏含牛客网华为专栏.华为面经试题.华为OD机试真题. 如果您在准备华为的面试,期间有想了解的可以私信我,我会 ...

  8. 华为OD机试真题2023(JAVA)

    华为机试题库已由2022版换为2023版 华为机试有三道题目,第一道和第二道属于简单或中等题,分值为100分,第三道为中等或困难题,分值为200分.总分为400分,150分钟考试时间.之前通过为150 ...

  9. 【华为OD机试真题2023 JAVA】不含101的数

    华为OD机试真题,2023年度机试题库全覆盖,刷题指南点这里 不含101的数 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: 小明在学习二进制时,发现了一类不含101的数,也就是: ...

  10. 【华为机试真题详解】不含 101 的数【2022 Q4 | 100分】

    文章目录 前言 题目描述 输入描述 输出描述 示例 1 示例2 题目解析 参考代码 前言 <华为机试真题详解 Python实现>专栏含牛客网华为专栏.华为面经试题.华为OD机试真题. 如果 ...

最新文章

  1. idea直连linux部署项目,idea项目打包和在linux的部署
  2. Flutter开发之Debug调试(十)
  3. Stanford UFLDL教程 白化
  4. html表单输入的文本框的值,网页设计关于表单输入框的技巧代码
  5. 对“粘连”footer布局的思考和总结
  6. redis相关(搭建和数据落盘)
  7. 云大计算机昆工,云南最好的7所大学,分3档!本地人青看中昆医大,外省更爱昆工!...
  8. JavaScript学习(七十一)—call、apply、bind学习总结
  9. 基于centos的FasfDFS安装配置
  10. Tomcat7与Tomcat8的差异详细对比
  11. ZigBee的应用场景
  12. 电脑重装系统苹果笔记本开不了机的解决措施有哪些
  13. 语音识别(五)——Mel-Frequency Analysis, FBank, 语音识别的评价指标, 声学模型进阶
  14. 4K网络视频下载器:4K Video Downloader mac汉化教程
  15. NVIDIA显卡驱动的安装失败
  16. 内网渗透建立代理通道(如何攻击目标内网机器?)-Socks代理(゚益゚メ) 渗透测试
  17. Android 仿微信图片选择器 PictureSelector3.0 的使用
  18. 托福阅读基础训练方法
  19. JQuery入门(1) - 选择器
  20. mysql数据库表锁、行锁

热门文章

  1. 影视剪辑,视频剪辑的万能剪辑技巧来啦,剪辑技巧合集
  2. 短视频剪辑技巧及运营方法 ,让你的视频更自然
  3. 数字化智慧园区建设方案
  4. 优盘安装红帽linux系统,RedHat Linux系统U盘安装图文教程
  5. 利用ant自动从vss下载代码并编译到自动发布
  6. VC编程中20种各种编程技巧和方法
  7. 手游天涯明月刀服务器维护到几点,天涯明月刀手游 1月21日停服维护 维护更新详解内容介绍...
  8. 如何根据纬度和经度获取城市名称
  9. 数据挖掘 应用案例集
  10. 科创板已开板 区块链离科创板还远吗?