当前位置:   article > 正文

华为OD机试C卷编程题题解汇总(持续更新)_牛客网华为od编程测试题

牛客网华为od编程测试题

目录

1、用连续自然数之和来表达整数

2、题目描述:密码输入检测

3、找出作弊的人

4、找座位

5、求满足条件的最长子串的长度

6、万能单词拼写

7、内存冷热标记

8、学生排名_智能成绩表

9、最多购买宝石数目  

10、构成指定长度字符串的个数

11、幸存数之和

12、高矮个子排队

13、关联子串

14、求满足条件的最长子串的长度

16、中庸行者

17、小华地图寻宝

18、跳马问题 dfs/bfs

19、园区参观路径 dfs/bfs

20、5G网络建设

21、计算三叉搜索树的高度

22、石头剪刀布游戏

23、分配土地

24、王者荣耀比赛

25、执行任务赚积分

26、机器人搬砖

27、分披萨

 C++语法重点


1、用连续自然数之和来表达整数

 一个整数可以由连续的自然数之和来表示。

给定一个整数,计算该整数有几种连续自然数之和的表达式,且打印出每种表达式

输入描述

一个目标整数T (1 <=T<= 1000)

输出描述

该整数的所有表达式和表达式的个数。如果有多种表达式,输出要求为:

自然数个数最少的表达式优先输出

每个表达式中按自然数递增的顺序输出,具体的格式参见样例。

在每个测试数据结束时,输出一行”Result:X”,其中X是最终的表达式个数。

  1. #include <iostream>
  2. #include <ostream>
  3. #include <algorithm>
  4. #include <sstream>
  5. #include <string>
  6. #include <cctype>
  7. #include <vector>
  8. using namespace std;
  9. bool cmp_length(const string s1, const string s2){
  10. return s1.length() < s2.length();
  11. }
  12. void find_sum(const int tar, vector<string>& exp){
  13. for(int i = 1; i <= tar; i++){
  14. int sum_i = 0;
  15. cout << "i = " << i << endl;
  16. string expresion_i = to_string(tar) + "=";
  17. for(int j = i; j <= tar; j++){//sum_i < target
  18. sum_i += j;
  19. expresion_i += to_string(j) + "+";
  20. if(tar == sum_i){
  21. expresion_i = expresion_i.substr(0, expresion_i.length() - 1);
  22. exp.push_back(expresion_i);
  23. cout << expresion_i << endl;
  24. break;
  25. }
  26. }
  27. }
  28. }
  29. int main(){
  30. cout << "input target =" << endl;
  31. int target;
  32. cin >> target;
  33. cout << "target = " << target << endl;
  34. vector<string> expression;
  35. find_sum(target, expression);
  36. cout << "vector_size = " << expression.size() << endl;
  37. sort(expression.begin(), expression.end(), cmp_length);
  38. for(auto exp : expression){//exp&
  39. cout << exp;
  40. cout << endl;
  41. }
  42. cout << endl;
  43. return 0;
  44. }

传容器要传引用

sort要传新函数名

string可以用+

substr(pos,从pos开始拷贝n个)

容器名.pushback()往容器放东西

打印容器for(auto vector : vectors){cout << vector};

2、题目描述:密码输入检测

给定用户密码输入流input,输入流中字符’<'表示退格,可以清除前一个输入的字符,请你编写程序,输出最终得到的密码字符,并判断密码是否满足如下

安全要求。

密码安全要求如下:

1.密码长度>=8;

2.密码至少需要包含1个大写字母;

3.密码至少需要包含1个小写字母;

4.密码至少需要包含1个数字;

5.密码至少需要包含1个字母和数字以外的非空白特殊字符

注意空串退格后仍然为空串,且用户输入的字符串不包含‘<’字符和空白字符。

输入描述

用一行字符串表示输入的用户数据,输入的字符串中‘<’字符标识退格,用户输入的字符串不包含空白字符,例如: ABC<c89%000<

输出描述

输出经过程序处理后,输出的实际密码字符串,并输出改密码字符串是否满足密码安全要求。两者间由‘,’分隔, 例如: ABc89%00,true

  1. #include <iostream>
  2. #include <ostream>
  3. #include <algorithm>
  4. #include <sstream>
  5. #include <string>
  6. #include <cctype>
  7. #include <vector>
  8. using namespace std;
  9. int main(){
  10. cout << "input origin string =" << endl;
  11. string origin_string;
  12. cin >> origin_string;
  13. cout << "origin string = " << origin_string << endl;
  14. bool bigger_eight = false, include_big= false, include_small= false, include_number= false, include_strange= false;
  15. vector<char> last_array;
  16. for(auto char_in : origin_string){
  17. if ('<' == char_in){
  18. if(!last_array.empty()){
  19. last_array.pop_back();
  20. }
  21. }
  22. else{
  23. last_array.push_back(char_in);
  24. cout << "char_in =" << char_in << endl;
  25. if((char_in >= 'A') && (char_in <= 'Z')){
  26. include_big = true;
  27. }
  28. else if((char_in >= 'a') && (char_in <= 'z')){
  29. include_small = true;
  30. }
  31. else if((char_in >= '0') && (char_in <= '9')){
  32. include_number = true;
  33. }
  34. else{
  35. include_strange = true;
  36. }
  37. }
  38. }
  39. if (last_array.size() >= 8){
  40. bigger_eight = true;
  41. }
  42. cout << "last string = " << endl;
  43. for (auto char_in_string : last_array){
  44. cout << char_in_string;
  45. }
  46. cout << "," ;
  47. cout << "every result=" << bigger_eight<<include_big<<include_small<<include_number<<include_strange<<endl;
  48. if (bigger_eight&&include_big&&include_small&&include_number&&include_strange)
  49. cout << "true";
  50. else
  51. cout << "false";
  52. cout << endl;
  53. return 0;
  54. }

string.length()  vector.size() 别弄混了

vector.push_back() vector.pop_back(char) vector.empty() 不需要求长度

特殊字符的bool值在每种情况都被改了!导致include_strange是最后一个字符的结果

3、找出作弊的人

题目描述

公司组织了一次考试,现在考试结果出来了,想看一下有没人存在作弊行为,但是员工太多了,需要先对员工进行一次过滤,

再进一步确定是否存在作弊行为。

过滤的规则为:找到分差最小的员工ID对(p1,p2)列表,要求p1<p2

员工个数取值范国:O<n<100000

员工ID为整数,取值范围:0<=n<=100000

考试成绩为整数,取值范围:0<=score<=300

输入描述

员工的ID及考试分数

输出描述

分差最小的员工ID对(p1,p2)列表,要求p1<p2。每一行代表一个集合,每个集合内的员工ID按顺序排列,多行结果也以员工

对中p1值大小升序排列(如果p1相同则p2升序)。

  1. vector<pair<int, int>> employee;
  2. cin >> employee[i].first >> employee[i].second;
  3. cmp_pair(pair<int, int> a, pair<int, int> b){
  4. a.second < b.second
  5. }

pair的使用如上

C++ vector中使用pair 及 pair的基本用法总结(转) - 简书 (jianshu.com)

4、找座位

题目描述

在一个大型体育场内举办了一场大型活动,由于疫情防控的需要,要求每位观众的必须间隔至少一个空位才允许落座。

现在给出一排观众座位分布图,座位中存在已落座的观众,请计算出,在不移动现有观众座位的情况下,最多还能坐下多少名观众。

输入描述

一个数组,用来标识某一排座位中,每个座位是否已经坐人。0表示该座位没有坐人,1表示该座位已经坐人。

1 ≤ 数组长度 ≤ 10000

输出描述

整数,在不移动现有观众座位的情况下,最多还能坐下多少名观众。

用例1

输入

10001

输出

1

用例2

输入

0101

输出

0

  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. int main() {
  5. string input;//string可以直接用数组角标
  6. cin >> input; // 读取输入的座位信息
  7. int maxAdditional = 0; // 最大额外观众数初始化为0
  8. for (int i = 0; i < input.length(); i++) { // 遍历座位数组
  9. if (input[i] == '0' && (i == 0 || input[i - 1] == '0') && (i == input.length() - 1 || input[i + 1] == '0')) {
  10. // 如果当前位置是空座且左侧或右侧也是空座,执行以下操作,不需要前后加0,直接特殊情况加条件上即可
  11. maxAdditional++; // 最大额外观众数加1
  12. input[i] = '1'; // 将当前位置标记为已坐人,避免了多个000的情况
  13. i++; // 跳过下一个位置,因为已经坐人
  14. }
  15. }
  16. cout << maxAdditional << endl; // 打印最大额外观众数
  17. return 0;
  18. }

string[]的用法

特殊情况简化为判断条件

5、求满足条件的最长子串的长度

重看,有空自己重写

题目描述

给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度,字符串本身是其最长的子

串,子串要求:

1、 只包含1个字母(a~z, A~Z),其余必须是数字;

2、 字母可以在子串中的任意位置;

如果找不到满足要求的子串,如全是字母或全是数字,则返回-1。

输入描述

字符串(只包含字母和数字)

输出描述

子串的长度

判断是否是字母(isalpha(c))

顺序遍历,查找子串使用queue

  1. #include <iostream>
  2. #include <deque>
  3. #include <string>
  4. using namespace std;
  5. int main() {
  6. // 读取输入的字符串
  7. string str;
  8. cin >> str;
  9. // 初始化最长子串长度为-1
  10. int maxLen = -1;
  11. // 初始化一个标志,表示是否找到了包含字母的子串
  12. bool hasLetter = false;
  13. // 初始化双指针l和r,分别表示子串的左右边界
  14. int l = 0, r = 0;
  15. // 创建一个双端队列用于存储字母的索引
  16. deque<int> letterIdx;
  17. // 遍历字符串
  18. while (r < str.length()) {
  19. // 获取当前字符
  20. char c = str[r];
  21. // 如果当前字符是字母
  22. if (isalpha(c)) {
  23. // 设置标志为true,表示找到了包含字母的子串
  24. hasLetter = true;
  25. // 将字母的索引添加到队列的尾部
  26. letterIdx.push_back(r);
  27. // 如果队列中有多于1个字母的索引
  28. if (letterIdx.size() > 1) {
  29. // 移除队列头部的字母索引,并将左指针l移动到该索引的下一个位置
  30. l = letterIdx.front() + 1;
  31. letterIdx.pop_front();
  32. }
  33. // 如果右指针r等于左指针l,跳过当前循环
  34. if (r == l) {
  35. r++;
  36. continue;
  37. }
  38. }
  39. // 更新最长子串长度
  40. maxLen = max(maxLen, r - l + 1);
  41. // 移动右指针
  42. r++;
  43. }
  44. // 如果没有找到包含字母的子串,输出-1
  45. if (!hasLetter) {
  46. cout << -1 << endl;
  47. } else {
  48. // 否则输出最长子串长度
  49. cout << maxLen << endl;
  50. }
  51. return 0;
  52. }
6、万能单词拼写

题目描述

有一个字符串数组 words 和一个字符串 chars。假如可以用 chars 中的字母拼写出 words 中的某个“单词”(字符串),那么我们就认为你掌握了这个单词。

words 的字符仅由 a-z 英文小写字母组成,例如 “abc”

chars 由 a-z 英文小写字母和 “?” 组成。其中英文 “?” 表示万能字符,能够在拼写时当作任意一个英文字母。例如:“?” 可以当作 “a” 等字母。

注意:每次拼写时,chars 中的每个字母和万能字符都只能使用一次。

输出词汇表 words 中你掌握的所有单词的个数。没有掌握任何单词,则输出0。

输入描述

第一行:输入数组 words 的个数,记作N。

第二行 ~ 第N+1行:依次输入数组words的每个字符串元素

第N+2行:输入字符串chars

输出描述

输出一个整数,表示词汇表 words 中你掌握的单词个数

备注

1 ≤ words.length ≤ 100

1 ≤ words[i].length, chars.length ≤ 100

所有字符串中都仅包含小写英文字母、英文问号

统计chars每个字符的数量和?数量。

统计words每个字符数量。求出words比chars多的字符数量(每次求出差值就用问号数量去减,减到小于0就无法拼写),如果小于?数量,则无法拼写。

  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4. using namespace std;
  5. // 判断是否可以拼写单词
  6. bool canSpell(vector<int>& wordCount, vector<int>& count, int wildcards) {
  7. for (int i = 0; i < 26; i++) {
  8. if (wordCount[i] > count[i]) {
  9. wildcards -= wordCount[i] - count[i]; // 如果单词中的字母数量大于字符集中的字母数量,则使用问号替代
  10. if (wildcards < 0) {
  11. return false; // 如果问号不足,则返回false
  12. }
  13. }
  14. }
  15. return true; // 如果所有的字母都可以匹配,则返回true
  16. }
  17. int main() {
  18. int N;
  19. cin >> N; // 读取单词数量
  20. cin.ignore(); // 忽略换行符
  21. vector<string> words(N);
  22. for (int i = 0; i < N; i++) {
  23. getline(cin, words[i]); // 读取每个单词
  24. }
  25. string chars;
  26. getline(cin, chars); // 读取字符集
  27. vector<int
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/705506
推荐阅读
相关标签
  

闽ICP备14008679号