清远专业网站建设,515ppt网站建设,国外免费舆情网站有哪些软件,wordpress portfolio 缩略图牛客网华为机试 上篇#xff1a;算法|牛客网华为机试10-20C 文章目录 HJ21 简单密码HJ22 汽水瓶HJ23 删除字符串中出现次数最少的字符HJ24 合唱队HJ25 数据分类处理HJ26 字符串排序HJ27 查找兄弟单词HJ28 素数伴侣HJ29 字符串加解密HJ30 字符串合并处理 HJ21 简单密码
题目描…牛客网华为机试 上篇算法|牛客网华为机试10-20C 文章目录 HJ21 简单密码HJ22 汽水瓶HJ23 删除字符串中出现次数最少的字符HJ24 合唱队HJ25 数据分类处理HJ26 字符串排序HJ27 查找兄弟单词HJ28 素数伴侣HJ29 字符串加解密HJ30 字符串合并处理 HJ21 简单密码
题目描述
解题思路 使用switch case加ASCII码大小写字母差32来解答33为向后移动一位。 解法
#include iostreamusing namespace std;int main() {string str;cin str;for (int i0; istr.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;cinstr;mapchar,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_intone_char.second){min_int one_char.second;if(min_int 1)break;}}vectorchar 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())coutc;}
}HJ24 合唱队
题目描述
解题思路 使用动态规划找到最长递增子序列最长递减子序列 解法
#include algorithm
#include iostream
#include vector
using namespace std;int main() {int n;while (cinn) {// 输入的数组int tmp;vectorint vec;for(int i0;in;i){cintmp;vec.push_back(tmp);}// 最长递增子序列长度if(vec.empty()) return 0;vectorint dp1(n,0); for(int i0;in;i){dp1[i] 1;for(int j0;ji;j){if(vec[i]vec[j])dp1[i] max(dp1[i],dp1[j]1);}}// 最长递减子序列长度vectorint dp2(n,0);for(int i n-1; i 0;--i){dp2[i] 1;for(int jn-1;ji;--j){if(vec[i] vec[j])dp2[i] max(dp2[i], dp2[j]1);}}int maxLength 0;for(int i0;in;i){// i是中点if(maxLengthdp1[i]dp2[i]-1){maxLength dp1[i]dp2[i]-1;}}cout n-maxLengthendl;}return 0;
}HJ25 数据分类处理
题目描述 解题思路 就是找I里是否包含R的子串输出索引和值。
解法
// 就是找I里是否包含R的子串输出索引和值
#include bits/stdc.husing namespace std;int main() {// 这个是把我们的I数组输入进去int n;cin n;vectorstring I(n);for (auto it : I) cin it;// 这个实现了我们R数组的去重和排序int m;cin m;setint st;for (int i 1; i m; i) {int tmp;cin tmp;st.insert(tmp);}vectorint 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所有字母出现统计mapchar,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;cinsize;// 再输入n个单词作为字典单词vectorstring str_vec;for (int i0; isize; i) {string str;cinstr;str_vec.push_back(str);}// 输入一个单词xstring com_str;cincom_str;// 最后后输入一个整数kint index;cinindex;// 输出字符串 如果是兄弟单词放入容器vectorstring output_vec;for(int i0;istr_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()); coutoutput_vec.size()endl;// 如果索引合法输出if(index output_vec.size()1 output_vec.size() 0)coutoutput_vec.at(index-1);
}HJ28 素数伴侣
题目描述
解题思路 题解 | #素数伴侣# 将问题分解首先整理出奇数数组和偶数数组再查找每个偶数匹配哪个奇数判断两数和是否是素数使用find迭代获取匹配结果。 解法
#include iostream
#include vector
using namespace std;
// 判断一个数是否是素数
bool isprime(int num){for(int i2;i*inum;i){ // 判断一个数是否为素数if(num % i 0) // 检查有无余数return false;}return true;
}// 参数待匹配的奇数偶数数组是否被使用过了匹配数组索引是偶数数组size值为匹配的奇数值
bool find(int num,vectorint evens,vectorbool used,vectorint match){// 遍历每个偶数与奇数比较for(int i0;ievens.size();i){ if(isprime(numevens[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 (cinn) {// 输入 n 个整数vectorint odds,evens,nums(n);for(int i0;in;i){cinnums[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){coutcountendl;continue;}// 统计每个偶数的配对是哪个奇数vectorint match(evens.size(),0); //遍历每个奇数for(int i0;iodds.size();i){//每一轮偶数都没用过vectorbool used(evens.size(),false);//能否找到配对的偶数且要最优if(find(odds[i],evens,used,match))count;}coutcountendl;}return 0;
}
// 64 位输出请用 printf(%lld)HJ29 字符串加解密
题目描述
解题思路 暴力解。 解法
#include iostream
#include stringusing namespace std;int main() {// 加密解密string str1,str2;cinstr1str2;// 加密for(auto str:str1){if (strastrz) {str -32-1;}else if(str z){str A;}else if(strAstrZ){str 321;}else if (str Z) {str a;}else if(str0 str9){str 1;}else if(str 9)str 0;}// 解密for(auto str:str2){if (strastrz) {str -321;}else if(str a){str Z;}else if(strAstrZ){str 32-1;}else if (str A) {str z;}else if(str0 str9){str - 1;}else if(str 0)str 9;}coutstr1endlstr2;
}HJ30 字符串合并处理
题目描述
解题思路 华为机试在线训练_字符串合并处理字符串、排序 解法
#include iostream
#include algorithm
using namespace std;
//字符串合并处理的函数接口
void Process_String(string str1, string str2, string strOutput)
{//字典法只考虑 0 到 9 a 到 fA 到 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;
}