网站应当实现那些功能 流程如何设计,西安创意网站建设,改行做网站,有域名怎么免费建站算法学习——华为机考题库4#xff08;HJ26 - HJ30#xff09;
HJ26 字符串排序
描述
编写一个程序#xff0c;将输入字符串中的字符按如下规则排序。
规则 1 #xff1a;英文字母从 A 到 Z 排列#xff0c;不区分大小写。
如#xff0c;输入#xff1a; Type 输出…算法学习——华为机考题库4HJ26 - HJ30
HJ26 字符串排序
描述
编写一个程序将输入字符串中的字符按如下规则排序。
规则 1 英文字母从 A 到 Z 排列不区分大小写。
如输入 Type 输出 epTy
规则 2 同一个英文字母的大小写同时存在时按照输入顺序排列。
如输入 BabA 输出 aABb
规则 3 非英文字母的其它字符保持原来的位置。
如输入 By?e 输出 Be?y
**数据范围**输入的字符串长度满足 1≤n≤1000
输入描述 输入字符串 输出描述 输出字符串
示例 代码解析
#include algorithm
#include iostream
#include string
#include vector
using namespace std;static bool cmp(pairchar,int p1, pairchar,int p2)
{int c1 p1.first , c2 p2.first;int i1 , i2;if(c1 a c1 z) i1 c1 - a;else i1 c1 - A;if(c2 a c2 z) i2 c2 - a;else i2 c2 - A;if(i1 i2) return true;else if(i1 i2) return false;return p1.second p2.second;
}int main() {string tmpStr;vectorpairchar,int tmpVec;getline(cin, tmpStr);for (int i0 ; itmpStr.size() ; i){if( (tmpStr[i] A tmpStr[i] Z) || (tmpStr[i] a tmpStr[i] z) )tmpVec.push_back({tmpStr[i],i});}sort(tmpVec.begin(), tmpVec.end(),cmp);int indnx 0;for (int i0 ; itmpStr.size() ; i){if( (tmpStr[i] A tmpStr[i] Z) || (tmpStr[i] a tmpStr[i] z) ){tmpStr[i] tmpVec[indnx].first;indnx;}}couttmpStr;}
// 64 位输出请用 printf(%lld)HJ27 查找兄弟单词
描述
定义一个单词的“兄弟单词”为交换该单词字母顺序注可以交换任意次而不添加、删除、修改原有的字母就能生成的单词。 兄弟单词要求和原来的单词不同。例如 ab 和 ba 是兄弟单词。 ab 和 ab 则不是兄弟单词。 现在给定你 n 个单词另外再给你一个单词 x 让你寻找 x 的兄弟单词里按字典序排列后的第 k 个单词是什么 注意字典中可能有重复单词。
数据范围 1≤n≤1000 输入的字符串长度满足 1≤len(str)≤10 1≤kn 输入描述 输入只有一行。 先输入字典中单词的个数n再输入n个单词作为字典单词。 然后输入一个单词x 最后后输入一个整数k 输出描述 第一行输出查找到x的兄弟单词的个数m 第二行输出查找到的按照字典顺序排序后的第k个兄弟单词没有符合第k个的话则不用输出。
示例 代码解析
#include algorithm
#include iostream
#include set#include string
#include vector
using namespace std;bool cheak(string aim , string date)
{if(aim date) return false;multisetchar aimSet;multisetchar dateSet;for(int i0 ; iaim.size() ;i)aimSet.insert(aim[i]);for(int i0 ; idate.size() ;i)dateSet.insert(date[i]);if(aimSet dateSet) return true;else return false;}int main() {int num;vectorstring date;vectorstring result;cinnum;string tmpStr;while(num--) {cintmpStr;date.push_back(tmpStr);}string aim;cinaim;int k;cink;k - 1;for(int i0 ; idate.size() ; i){if(cheak(aim, date[i]) true)result.push_back(date[i]);}sort(result.begin(), result.end());coutresult.size()endl;if(result.size() k) coutresult[k];}
// 64 位输出请用 printf(%lld)HJ28 素数伴侣
描述
题目描述 若两个正整数的和为素数则这两个正整数称之为“素数伴侣”如2和5、6和13它们能应用于通信加密。现在密码学会请你设计一个程序从已有的 N N 为偶数个正整数中挑选出若干对组成“素数伴侣”挑选方案多种多样例如有4个正整数25613如果将5和6分为一组中只能得到一组“素数伴侣”而将2和5、6和13编组将得到两组“素数伴侣”能组成“素数伴侣”最多的方案称为“最佳方案”当然密码学会希望你寻找出“最佳方案”。
输入:
有一个正偶数 n 表示待挑选的自然数的个数。后面给出 n 个具体的数字。
输出:
输出一个整数 K 表示你求得的“最佳方案”组成“素数伴侣”的对数。
数据范围 1≤n≤100 输入的数据大小满足 2≤val≤30000 输入描述 输入说明 1 输入一个正偶数 n 2 输入 n 个整数
输出描述 求得的“最佳方案”组成“素数伴侣”的对数。
示例 代码解析
#includeiostream
#includevector
using namespace std;bool isprime(int num)//判断一个数是否是素数
{ for(int i 2; i * i num; i)//遍历到根号num{ if(num % i 0) //检查有无余数return false;}return true;
}bool find(int num, vectorint evens, vectorbool used, vectorint match)
{for(int i 0; i evens.size(); i)//遍历每个偶数与奇数比较{ if(isprime(num evens[i]) used[i] false){used[i] true;if(match[i] 0 || find(match[i], evens, used, match) true)//如果第i个偶数还未配对或者跟它配对的奇数还有别的选择{ match[i] num; //则配对该数return true;}}}return false;
}
int main(){int n;cin n;vectorint odds;vectorint evens;vectorint nums(n);for(int i 0; i n; i)//输入n个数{ 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;return 0;}vectorint match(evens.size(), 0); //统计每个偶数的配对是哪个奇数for(int i 0; i odds.size(); i)//遍历每个奇数{ vectorbool used(evens.size(), false); //每一轮偶数都没用过if(find(odds[i], evens, used, match) true) //能否找到配对的偶数且要最优count;}cout count endl;return 0;
}
HJ29 字符串加解密
描述
对输入的字符串进行加解密并输出。
加密方法为
当内容是英文字母时则用该英文字母的后一个字母替换同时字母变换大小写,如字母a时则替换为B字母Z时则替换为a
当内容是数字时则把该数字加1如0替换11替换29替换0
其他字符不做变化。
解密方法为加密的逆过程。 数据范围输入的两个字符串长度满足 1≤n≤1000 保证输入的字符串都是只由大小写字母或者数字组成 输入描述 第一行输入一串要加密的密码 第二行输入一串加过密的密码
输出描述 第一行输出加密后的字符 第二行输出解密后的字符
示例 代码解析
#include iostream
#include string
using namespace std;void code(string tmp)
{for(int i0 ; i tmp.size() ; i){if(tmp[i] a tmp[i] z) cout (char)(tmp[i] - a A 1);else if( tmp[i] z) coutA;else if(tmp[i] A tmp[i] Z) cout (char)(tmp[i] - A a 1);else if( tmp[i] Z) couta;else if(tmp[i] 0 tmp[i] 9) cout(char)(tmp[i] 1);else if( tmp[i] 9) cout0;}
}void uncode(string tmp)
{for(int i0 ; i tmp.size() ; i){if(tmp[i] a tmp[i] z) cout (char)(tmp[i] - a A - 1);else if( tmp[i] a) coutZ;else if(tmp[i] A tmp[i] Z) cout (char)(tmp[i] - A a - 1);else if( tmp[i] A) coutz;else if(tmp[i] 0 tmp[i] 9) cout(char)(tmp[i] - 1);else if( tmp[i] 0) cout9;}
}int main() {string Str1;string Str2;cinStr1;cinStr2;code(Str1);coutendl;uncode(Str2);}
// 64 位输出请用 printf(%lld)HJ30 字符串合并处理
描述
按照指定规则对输入的字符串进行处理。
详细描述
第一步将输入的两个字符串str1和str2进行前后合并。如给定字符串 “dec” 和字符串 “fab” 合并后生成的字符串为 “decfab”
第二步对合并后的字符串进行排序要求为下标为奇数的字符和下标为偶数的字符分别从小到大排序。这里的下标的意思是字符在字符串中的位置。注意排序后在新串中仍需要保持原来的奇偶性。例如刚刚得到的字符串“decfab”分别对下标为偶数的字符’d’、‘c’、‘a’和下标为奇数的字符’e’、‘f’、b’进行排序生成 ‘a’、‘c’、‘d’ 和 ‘b’ 、‘e’ 、‘f’再依次分别放回原串中的偶数位和奇数位新字符串变为“abcedf”
第三步对排序后的字符串中的’0’‘9’、‘A’‘F’和’a’~f’字符需要进行转换操作。 转换规则如下 对以上需要进行转换的字符所代表的十六进制用二进制表示并倒序然后再转换成对应的十六进制大写字符注字符 a~f 的十六进制对应十进制的10~15大写同理。 如字符 ‘4’其二进制为 0100 则翻转后为 0010 也就是 2 。转换后的字符为 ‘2’。 如字符 ‘7’其二进制为 0111 则翻转后为 1110 对应的十进制是14转换为十六进制的大写字母为 ‘E’。 如字符 ‘C’代表的十进制是 12 其二进制为 1100 则翻转后为 0011也就是3。转换后的字符是 ‘3’。 根据这个转换规则由第二步生成的字符串 “abcedf” 转换后会生成字符串 “5D37BF”。
**数据范围**输入的字符串长度满足 1≤n≤100
输入描述 样例输入两个字符串用空格隔开。
输出描述 输出转化后的结果。
示例 代码解析
#include algorithm
#include iostream
#include string
#include vector
using namespace std;//字典法只考虑 0 到 9 a 到 fA 到 F 的字符即可其余字符不做改变照原输出
string Intput 0123456789abcdefABCDEF; //输入参照字典数字 大小写字母
// int Output[] 084c2a6e195d3b7f5d3b7f; //输出参照字典小写
string Output 084C2A6E195D3B7F5D3B7F; //输出参照字典数字 大写字母
char code( char tmpChar)
{int indnx Intput.find(tmpChar);if(indnx ! -1) return Output[ indnx ];else return tmpChar;}int main() {string Str1 , Str2;cinStr1Str2;string Str Str1 Str2;vectorchar even;vectorchar odd;for(int i0 ; iStr.size() ; i){if(i%2 0) even.push_back(Str[i]);else odd.push_back(Str[i]);}sort(even.begin(), even.end());reverse(even.begin(),even.end());sort(odd.begin(), odd.end());reverse(odd.begin(),odd.end());for(int i0 ; iStr.size() ; i){if(i%2 0){Str[i] even.back();even.pop_back();} else {Str[i] odd.back();odd.pop_back();}}// coutStrendl;for(int i0 ; iStr.size() ; i){Str[i] code(Str[i]);}coutStrendl;}
// 64 位输出请用 printf(%lld)