算法|牛客网华为机试21-30C++

牛客网华为机试
上篇:算法|牛客网华为机试10-20C++

文章目录

  • HJ21 简单密码
  • HJ22 汽水瓶
  • HJ23 删除字符串中出现次数最少的字符
  • HJ24 合唱队
  • HJ25 数据分类处理
  • HJ26 字符串排序
  • HJ27 查找兄弟单词
  • HJ28 素数伴侣
  • HJ29 字符串加解密
  • HJ30 字符串合并处理

HJ21 简单密码

题目描述:
在这里插入图片描述

解题思路:
使用switch case加ASCII码大小写字母差32来解答,33为向后移动一位。
解法:

#include <iostream>using namespace std;int main() {string str;cin >> str;for (int i=0; i<str.size(); i++) {switch(str[i]) {case 'A' ... 'Y': str[i] += 33; break;case 'Z': str[i] = 'a'; break;case 'a' ... 'c': str[i] = '2'; break;case 'd' ... 'f': str[i] = '3'; break;case 'g' ... 'i': str[i] = '4'; break;case 'j' ... 'l': str[i] = '5'; break;case 'm' ... 'o': str[i] = '6'; break;case 'p' ... 's': str[i] = '7'; break;case 't' ... 'v': str[i] = '8'; break;case 'w' ... 'z': str[i] = '9'; break;default: break;}}cout << str << endl;
}

HJ22 汽水瓶

题目描述:
在这里插入图片描述

解题思路:
可以接空瓶子,相当于每有两个空瓶就可以喝一瓶,结果直接除以2即可。
解法:

#include <iostream>
using namespace std;int main() {int a;while (cin >> a) { // 注意 while 处理多个 caseif(a == 0)break;cout<< a/2 <<endl;}
}

HJ23 删除字符串中出现次数最少的字符

题目描述:
在这里插入图片描述

解题思路:
首先使用map将所有字母出现次数记录;第二步找出出现次数最少的次数,如果为1就是最少的;第三步找出所有出现次数最少的字母;最后排除所有出现次数最少的字母输出结果。
解法:

#include <iostream>
#include <map>
#include <vector>
#include <algorithm> // 包含 std::find
using namespace std;int main() {string str;cin>>str;map<char,int> all_char; // key:字母 value:出现的次数for(auto a:str){// 如果只出现过一次if(all_char.find(a) == all_char.end()){all_char[a] = 1;continue;}else{all_char[a]++;}}// 找出出现最少的次数int min_int = 0;for(auto one_char:all_char){if(min_int == 0)min_int = one_char.second;if(min_int>one_char.second){min_int = one_char.second;if(min_int == 1)break;}}vector<char> min_char;// 使用迭代器遍历map 找出所有出现次数最少的字母for (auto it = all_char.begin(); it != all_char.end(); ) {if (it->second == min_int) {min_char.push_back(it->first);} ++it;}// 如果字母不是最少出现的字母之一 输出for(auto c:str){if(std::find(min_char.begin(), min_char.end(), c) == min_char.end())cout<<c;}
}

HJ24 合唱队

题目描述:
在这里插入图片描述

解题思路:
使用动态规划,找到最长递增子序列+最长递减子序列;
解法:

#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;int main() {int n;while (cin>>n) {// 输入的数组int tmp;vector<int> vec;for(int i=0;i<n;++i){cin>>tmp;vec.push_back(tmp);}// 最长递增子序列长度if(vec.empty()) return 0;vector<int> dp1(n,0);	for(int i=0;i<n;++i){dp1[i] = 1;for(int j=0;j<i;++j){if(vec[i]>vec[j])dp1[i] = max(dp1[i],dp1[j]+1);}}// 最长递减子序列长度vector<int> dp2(n,0);for(int i = n-1; i >= 0;--i){dp2[i] = 1;for(int j=n-1;j>i;--j){if(vec[i] > vec[j])dp2[i] = max(dp2[i], dp2[j]+1);}}int maxLength = 0;for(int i=0;i<n;++i){// i是中点if(maxLength<dp1[i]+dp2[i]-1){maxLength = dp1[i]+dp2[i]-1;}}cout<< n-maxLength<<endl;}return 0;
}

HJ25 数据分类处理

题目描述:

在这里插入图片描述
在这里插入图片描述

解题思路:
就是找I里是否包含R的子串,输出索引和值。

解法:

// 就是找I里是否包含R的子串,输出索引和值
#include <bits/stdc++.h>using namespace std;int main() {// 这个是把我们的I数组输入进去int n;cin >> n;vector<string> I(n);for (auto &it : I) cin >> it;// 这个实现了我们R数组的去重和排序int m;cin >> m;set<int> st;for (int i = 1; i <= m; i++) {int tmp;cin >> tmp;st.insert(tmp);}vector<int> res;for (auto &it : st) {// cnt是有多少个// okk是我们是否找到int cnt = 0;bool okk = false;for (auto &it1 : I) {// 如果找到了存入数组if (it1.find(to_string(it)) != string::npos) {cnt += 1;if (okk == false) {res.emplace_back(it);okk = true;}}}// !=0说明有找到if (cnt != 0) {// 我们每一次把我们的下标和我们的值存入res.emplace_back(cnt);for (int i = 0; i < n; i++) {if (I[i].find(to_string(it)) != string::npos) {res.emplace_back(i);res.emplace_back(stoi(I[i]));}}}}cout << res.size() << " ";for (auto &it : res) {cout << it << " ";}cout << "\n";return 0;
}

HJ26 字符串排序

题目描述:
在这里插入图片描述

解题思路:
首先利用和大小写字母A的差值,对应0-26,来将所有字母按顺序排好;再找出原始字符串里所有字母进行替换。
解法:

#include <iostream>
#include <vector>
using namespace std;
string String_Sorting(string str)
{int len = str.size(); //获取字符串长度vector <char> vec; //用一个 char 型的向量存储按规则排序后的字符串中的字母字符//规则一:英文字母从 A 到 Z 排列,不区分大小写。//规则二:同一个英文字母的大小写同时存在时,按照输入顺序排列。for (int j = 0; j < 26; j++){for (int i = 0; i < len; i++){// 如果是大写字母或者小写字母 按照a-z顺序放入 对应0-26if ((str[i] - 'a' == j) || (str[i] - 'A' == j)){vec.push_back(str[i]); //将符合规则的字母字符先后写入向量}}}//规则三:非英文字母的其它字符保持原来的位置。for(int i = 0,k = 0;(i < len) && (k < vec.size()); i++){// 如果str当前的值是大写或者小写字母 替换为vec里排好顺序的值if((str[i] >= 'a' && str[i] <= 'z') || (str[i] >= 'A' && str[i] <= 'Z')){str[i] = vec[k++];}}return str; //返回按规则排序好后的字符串
}
//主函数
int main()
{string str;while (getline(cin, str)){cout << String_Sorting(str) << endl;}return 0;
}

HJ27 查找兄弟单词

题目描述:
在这里插入图片描述

解题思路:
见注释。
解法:

#include <iostream>
#include <stdexcept>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;
// 判断两个字符串是否为兄弟单词
bool is_brother(string str1,string str2){if(str1 == str2 || str1.size()!=str2.size())return false;else {// 将str1所有字母出现统计map<char,int> str1_map;for(auto one:str1){if(str1_map.find(one) == str1_map.end()){str1_map[one] = 1;}else{str1_map[one]++;}}// 如果str2发现一个删除一个for(auto one:str2){// 如果有字母str1没有直接退出if(str1_map.find(one) == str1_map.end()){return false;}else{str1_map[one]--;if(str1_map[one] == 0)str1_map.erase(one);}}if (str1_map.size() == 0) {return true;}else {return false;}}
}int main() {// 输入字典中单词的个数nint size;cin>>size;// 再输入n个单词作为字典单词vector<string> str_vec;for (int i=0; i<size; ++i) {string str;cin>>str;str_vec.push_back(str);}// 输入一个单词xstring com_str;cin>>com_str;// 最后后输入一个整数kint index;cin>>index;// 输出字符串 如果是兄弟单词放入容器vector<string> output_vec;for(int i=0;i<str_vec.size();++i){if(is_brother(str_vec[i],com_str)){output_vec.push_back(str_vec[i]);}}// 字典序排序sort(output_vec.begin(), output_vec.end());  cout<<output_vec.size()<<endl;// 如果索引合法输出if(index <= output_vec.size()+1 && output_vec.size() > 0)cout<<output_vec.at(index-1);
}

HJ28 素数伴侣

题目描述:
在这里插入图片描述

解题思路:
题解 | #素数伴侣#
将问题分解,首先整理出奇数数组和偶数数组,再查找每个偶数匹配哪个奇数,判断两数和是否是素数,使用find迭代获取匹配结果。
解法:

#include <iostream>
#include <vector>
using namespace std;
// 判断一个数是否是素数
bool isprime(int num){for(int i=2;i*i<=num;++i){  // 判断一个数是否为素数if(num % i == 0)    // 检查有无余数return false;}return true;
}// 参数:待匹配的奇数;偶数数组;是否被使用过了;匹配数组索引是偶数数组size,值为匹配的奇数值
bool find(int num,vector<int>& evens,vector<bool>& used,vector<int>& match){// 遍历每个偶数与奇数比较for(int i=0;i<evens.size();++i){ if(isprime(num+evens[i]) && !used[i]){used[i] = true;// 如果第i个偶数还未配对,或者跟它配对的奇数还有别的选择if(match[i] == 0 || find(match[i],evens,used,match)){//则配对该数match[i] = num;return true;}}}return false;
}int main() {//  输入一个正偶数 nint n;while (cin>>n) {// 输入 n 个整数vector<int> odds,evens,nums(n);for(int i=0;i<n;++i){cin>>nums[i];if(nums[i]%2) // 奇数odds.push_back(nums[i]);else // 偶数evens.push_back(nums[i]);}int count = 0;// 缺少奇数或者偶数无法构成素数if(odds.size() == 0 || evens.size() == 0){cout<<count<<endl;continue;}// 统计每个偶数的配对是哪个奇数vector<int> match(evens.size(),0);  //遍历每个奇数for(int i=0;i<odds.size();++i){//每一轮偶数都没用过vector<bool> used(evens.size(),false);//能否找到配对的偶数,且要最优if(find(odds[i],evens,used,match))count++;}cout<<count<<endl;}return 0;
}
// 64 位输出请用 printf("%lld")

HJ29 字符串加解密

题目描述:
在这里插入图片描述

解题思路:
暴力解。
解法:

#include <iostream>
#include <string>using namespace std;int main() {// 加密,解密string str1,str2;cin>>str1>>str2;// 加密for(auto& str:str1){if (str>='a'&&str<'z') {str -=32-1;}else if(str == 'z'){str = 'A';}else if(str>='A'&&str<'Z'){str +=32+1;}else if (str == 'Z') {str = 'a';}else if(str>='0' && str<'9'){str += 1;}else if(str == '9')str = '0';}// 解密for(auto& str:str2){if (str>'a'&&str<='z') {str -=32+1;}else if(str == 'a'){str = 'Z';}else if(str>'A'&&str<='Z'){str +=32-1;}else if (str == 'A') {str = 'z';}else if(str>'0' && str<='9'){str -= 1;}else if(str == '0')str = '9';}cout<<str1<<endl<<str2;
}

HJ30 字符串合并处理

题目描述:
在这里插入图片描述
在这里插入图片描述

解题思路:
华为机试在线训练_字符串合并处理(字符串、排序)
解法:

#include <iostream>
#include <algorithm>
using namespace std;
//字符串合并处理的函数接口
void Process_String(string str1, string str2, string strOutput)
{//字典法:只考虑 '0' 到 '9' ,'a' 到 'f','A' 到 'F' 的字符即可,其余字符不做改变,照原输出char Intput[] = {"0123456789abcdefABCDEF"}; //输入参照字典(数字 + 大小写字母)
//    int Output[] = "084c2a6e195d3b7f5d3b7f"; //输出参照字典(小写)char Output[] = {"084C2A6E195D3B7F5D3B7F"}; //输出参照字典(数字 + 大写字母)strOutput = str1 + str2; //合并两个字符串string odd_str; //下标为奇数的字符组成的字符串,奇数位字符串string even_str; //下标为偶数的字符串组成的字符串,偶数位字符串//根据字符在合并字符串中的次序,按字典序分奇数位、偶数位独立来排,但次序的奇偶性不变,即原来是奇数位,排序后还是奇数位for (int i = 0; i < strOutput.size(); i++){if (i % 2 == 0){odd_str += strOutput[i];}else if (i % 2 == 1){even_str += strOutput[i];}}sort(odd_str.begin(), odd_str.end()); //奇排序sort(even_str.begin(), even_str.end()); //偶排序//将按奇数位、偶数位排序后的字符再填回合并字符串 strOutputint j = 0; //奇数位字符串的下标int k = 0; //偶数位字符串的下标for (int i = 0; i < strOutput.size(); i++){if (i % 2 == 0){strOutput[i] = odd_str[j];j++;}else if (i % 2 == 1){strOutput[i] = even_str[k];k++;}}//对字符(符合字典 Input[])所代表的 16 进制的数进行 BIT 倒序的操作,并转换为相应的大写字符for (int i = 0; i < strOutput.size(); i++){if ((strOutput[i] >= '0') && (strOutput[i] <= '9')){strOutput[i] = Output[strOutput[i] - '0'];}else if ((strOutput[i] >= 'a') && (strOutput[i] <= 'f')){strOutput[i] = Output[strOutput[i] - 'a' + 10];}else if ((strOutput[i] >= 'A') && (strOutput[i] <= 'F')){strOutput[i] = Output[strOutput[i] - 'A' + 16];}}cout << strOutput << endl;return;
}
//主函数
int main()
{string str1, str2, strOutput;while (cin >> str1 >>str2){Process_String(str1, str2, strOutput);}return 0;
}

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

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

相关文章

浅谈QT中Tab键的切换逻辑

浅谈QT中Tab键的切换逻辑 无意中发现在输入界面中按下Tab键时&#xff0c;没有按照预想的顺序切换焦点事件&#xff0c;如下图所示 这个现象还是很有趣&#xff0c;仔细观察了下&#xff0c;默认的切换顺序是按照控件拖入顺序&#xff0c;那么知道了这个问题想要解决起来就很简…

科研绘图系列:R语言组合连线图和箱线图(linechart+boxplot)

文章目录 介绍加载R包数据数据预处理画图1画图2系统信息介绍 连线图(Line Chart)是一种常用的数据可视化图表,它通过将一系列数据点用直线段连接起来来展示数据随时间或有序类别变化的趋势。以下是连线图可以表示的一些内容: 时间序列数据:展示数据随时间变化的趋势,例如…

PKG_CHECK_MODULES(FUSE,fuse)

运行 ./configure 命令报错如下&#xff1a; ./configure: line 13934: syntax error near unexpected token FUSE,fuse ./configure: line 13934: PKG_CHECK_MODULES(FUSE,fuse)解决方案&#xff1a; 命令窗口运行如下命令&#xff0c;安装 pkg-config&#xff1a; sudo …

react18中redux-promise搭配redux-thunk完美简化异步数据操作

用过redux-thunk的应该知道&#xff0c;操作相对繁琐一点&#xff0c;dispatch本只可以出发plain object。redux-thunk让dispatch可以返回一个函数。而redux-promise在此基础上大大简化了操作。 实现效果 关键逻辑代码 store/index.js import { createStore, applyMiddlewar…

Lucene分析器的详细使用(5)

文章目录 第5章 分析器5.1 分析器的组成5.1.1 字符过滤器1&#xff09;HTMLStripCharFilter2&#xff09;PatternReplaceCharFilter3&#xff09;MappingCharFilter4&#xff09;Luke使用字符过滤器 5.1.2 分词器1&#xff09;StandardTokenzier2&#xff09;keywordTokenizer3…

selinux和防火墙

SElinux 1、selinux代表的什么&#xff1f; SELinux是Security-Enhanced Linux的缩写&#xff0c;意思是安全强化的linux。 SELinux 主要由美国国家安全局&#xff08;NSA&#xff09;开发&#xff0c;当初开发的目的是为了避免资源的误用。 SELinux是对程序、文件等权限设置依…

CentOS 7 安装 ntp,自动校准系统时间

1、安装 ntp yum install ntp 安装好后&#xff0c;ntp 会自动注册成为服务&#xff0c;服务名称为 ntpd 2、查看当前 ntpd 服务的状态 systemctl status ntpd 3、启动 ntpd 服务、查看 ntpd 服务的状态 systemctl start ntpdsystemctl status ntpd 4、设置 ntpd 服务开机启…

Oracle OCP认证考试考点详解082系列11

题记&#xff1a; 本系列主要讲解Oracle OCP认证考试考点&#xff08;题目&#xff09;&#xff0c;适用于19C/21C,跟着学OCP考试必过。 51. 第51题&#xff1a; 题目 51.View the Exhibit and examine the description of the tables You execute this SQL statement Whi…

C#属性 Property

属性Property不是变量。 它们是由名为访问器方法来实现的一种方法。 实例属性表示的是实例的某个数据&#xff0c;通过这个数据反映实例当前的状态 静态属性表示的是类型的某个数据&#xff0c;通过这个数据反映类型当前的状态 意义&#xff1a; 防止恶意赋值(通过属性间接访问…

Spring框架的事务管理

目录 一、spring框架事务管理相关的类 1.PlatformTransactionManager接口 2.TransactionDefinition接口 二、spring框架声明式事务管理 1.配置文件的方式 &#xff08;1&#xff09;配置文件 &#xff08;2&#xff09;业务层 &#xff08;3&#xff09;持久层 &#…

angular实现list列表和翻页效果

说明&#xff1a;angular实现list列表和翻页效果 上一页 当前页面 下一页 效果图&#xff1a; step1: E:\projectgood\ajnine\untitled4\src\app\car\car.component.css .example-form-fields {display: flex;align-items: flex-start; }mat-list-item{background: antiquew…

PHP常量

PHP 中的常量是指一旦定义后将不能被改变的标识符。 常量可以用const和define&#xff08;&#xff09;来定义。 PHP常量的特性 不变性: 常量一旦定义&#xff0c;其值不能改变。全局作用域: 常量在定义后&#xff0c;可以在整个脚本的任何地方使用&#xff0c;无需使用 glo…

服务器作业(2)

架设一台NFS服务器&#xff0c;并按照以下要求配置 关闭防火墙 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 配置文件设置&#xff1a; [rootlocalhost ~]# vim /etc/exports 1、开放/nfs/shared目录&#xff0c;供所有用户查询资料 共享…

云轴科技ZStack在CID大会上分享VF网卡热迁移技术

近日&#xff0c;2024中国云计算基础架构开发者大会&#xff08;以下简称CID大会&#xff09;在北京举行。此次大会集中展示了云计算基础架构技术领域最前沿的科创成果&#xff0c;汇聚众多的技术专家和行业先锋&#xff0c;共同探讨云计算基础设施的最新发展和未来趋势。云轴科…

【Linux】命令行参数 | 环境变量

&#x1fa90;&#x1fa90;&#x1fa90;欢迎来到程序员餐厅&#x1f4ab;&#x1f4ab;&#x1f4ab; 主厨&#xff1a;邪王真眼 主厨的主页&#xff1a;Chef‘s blog 所属专栏&#xff1a;青果大战linux 总有光环在陨落&#xff0c;总有新星在闪烁 前几天在搞硬件&…

Spring Boot 配置文件启动加载顺序

前言 Spring Boot的启动加载顺序是一个涉及多个步骤和组件的过程。Spring Boot通过一系列默认设置简化了应用程序的配置&#xff0c;使得开发者能够快速地搭建和部署应用。为了实现这一目标&#xff0c;Spring Boot采用了一种分层和优先级机制来加载配置文件。 一、Spring Bo…

Linux(inode + 软硬链接 图片+大白话)

后面也会持续更新&#xff0c;学到新东西会在其中补充。 建议按顺序食用&#xff0c;欢迎批评或者交流&#xff01; 缺什么东西欢迎评论&#xff01;我都会及时修改的&#xff01; 在这里真的很感谢这位老师的教学视频让迷茫的我找到了很好的学习视频 王晓春老师的个人空间…

python在word的页脚插入页码

1、插入简易页码 import win32com.client as win32 from win32com.client import constants import osdoc_app win32.gencache.EnsureDispatch(Word.Application)#打开word应用程序 doc_app.Visible Truedoc doc_app.Documents.Add() footer doc.Sections(1).Footers(cons…

Echarts环形图引线设置

直接上图吧 直接上代码吧 let labelArr [直接访问, 邮件营销, 联盟广告, 视频广告, 搜索引擎]; let valueArr [{ value: 335, name: 直接访问 },{ value: 310, name: 邮件营销 },{ value: 234, name: 联盟广告 },{ value: 135, name: 视频广告 },{ value: 154, name: 搜索引…

学习虚幻C++开发日志——定时器

官方文档&#xff1a;虚幻引擎中的Gameplay定时器 | 虚幻引擎 5.5 文档 | Epic Developer Community | Epic Developer Community 定时器 安排在经过一定延迟或一段时间结束后要执行的操作。例如&#xff0c;您可能希望玩家在获取某个能力提升道具后变得无懈可击&#xff0c;…