我是靠谱客的博主 愤怒路人,最近开发中收集的这篇文章主要介绍牛客网——华为题库(21~30)21.简单密码22.汽水瓶23.删除字符串中出现次数最少的字符24.合唱队25.数据分类处理26.字符串排序27.查找兄弟单词28.素数伴侣29.字符串加解密30.字符串合并处理,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
华为题库
- 21.简单密码
- 22.汽水瓶
- 23.删除字符串中出现次数最少的字符
- 24.合唱队
- 25.数据分类处理
- 26.字符串排序
- 27.查找兄弟单词
- 28.素数伴侣
- 29.字符串加解密
- 30.字符串合并处理
21.简单密码
//#include <bits/stdc++.h>
#include <iostream>
#include <string>
#include <unordered_map>
#include <cstring>
using namespace std;
unordered_map<string, char> m = {
{"1", '1'},
{"abc", '2'},
{"def", '3'},
{"ghi", '4'},
{"jkl", '5'},
{"mno", '6'},
{"pqrs", '7'},
{"tuv", '8'},
{"wxyz", '9'},
{"0", '0'},
};
int main(){
string str = "";
cin>>str;
string res = "";
for(char c : str){
char ch;
if(!isdigit(c)){ //如果不是数字
if(c >= 'a' && c <= 'z'){
for(auto iter = m.begin(); iter != m.end(); iter++){
//cout<<iter->first.c_str()<<endl;
//cout<<iter->second<<endl;
if(iter->first.find(c) != iter->first.npos){ //找到了
ch = iter->second;
//cout<<ch<<endl;
res += ch;
break;
}
}
}
else if(c >= 'A' && c <= 'Z'){
if(c == 'Z'){ //特殊情况
ch = 'a';
}
else{
ch = c + 33; //先变成小写,再往后移一位
}
res += ch;
}
}
else{
res += c;
}
}
cout<<res<<endl;
return 0;
}
22.汽水瓶
#include <iostream>
#include <vector>
using namespace std;
void process(int num, int& ans){
if(num < 2) ans = 0;
while(num >= 2){
ans += 1;
num -= 3;
num += 1;
}
}
int main(){
int num = 0;
vector<int> res;
while(cin>>num && num != 0){
int ans = 0;
process(num, ans);
res.push_back(ans);
}
for(int i = 0; i < res.size(); i++){
cout<<res[i]<<endl;
}
return 0;
}
23.删除字符串中出现次数最少的字符
#include <iostream>
#include <string>
#include <unordered_map>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
string str = "";
cin >> str;
unordered_map<char, int> m;
for(char c : str){
m[c]++;
}
vector<int> tmp;
for(auto iter = m.begin(); iter != m.end(); iter++){
tmp.push_back(iter->second);
}
sort(tmp.begin(), tmp.end());
string res = "";
for(char c : str){
if(m[c] != tmp[0]){
res += c;
}
}
cout << res << endl;
return 0;
}
24.合唱队
#include <bits/stdc++.h>
using namespace std;
void process(vector<int> vec, int N, int& res){
vector<int> leftNum(N, 0);
vector<int> rightNum(N, 0);
//左边的最长序列长度
for(int i = 0; i < N; i++){
for(int j = 0; j < i; j++){
if(vec[j] < vec[i]){
leftNum[i] = max(leftNum[i], leftNum[j]);
}
}
leftNum[i] = leftNum[i] + 1;
//cout << leftNum[i]<<endl;
}
//右边的最长序列长度
for(int i = N - 1; i >= 0; i--){
for(int j = N - 1; j > i; j--){
if(vec[i] > vec[j]){
rightNum[i] = max(rightNum[i], rightNum[j]);
}
}
rightNum[i] = rightNum[i] + 1;
}
//求最长的序列长度
int maxValue = INT_MIN;
for(int i = 0; i < N; i++){
maxValue = max(maxValue, leftNum[i] + rightNum[i] - 1); //
}
res = N - maxValue;
return;
}
int main(){
int N = 0;
cin >> N;
vector<int> vec;
int h = 0;
for(int i = 0; i < N; i++){
cin >> h;
vec.push_back(h);
}
int res = 0;
process(vec, N, res);
cout << res << endl;
return 0;
}
25.数据分类处理
#include <bits/stdc++.h>
using namespace std;
bool isExist(string strI, string s){
return strstr(strI.c_str(), s.c_str()) != nullptr; //在strI中找s第一次出现的位置
}
void process(int sizeI, int sizeR, vector<int> I, vector<int> R){
sort(R.begin(), R.end()); //排序
//unique函数:”删除”序列中所有相邻的重复元素(只保留一个)。此处的删除,并不是真的删除,而是指重复元素的位置被不重复的元素给占领了
//单纯的使用unique函数的话,容器的长度并没有发生变化,只是元素的位置发生了变化
//返回值是一个迭代器,它指向的是去重后容器中不重复序列的最后一个元素的下一个元素。
//如1334667——>1346767,指向第2个6的位置;
//所以要搭配erase使用
vector<int>::iterator new_end = unique(R.begin(), R.end());//去重
R.erase(new_end, R.end());
unordered_map<string, vector<pair<string, int>>> mp;
for(int i = 0; i < R.size(); i++){
//cout << R[i] << " " << endl; //排序去重后的R
string tmp_rs = to_string(R[i]);
//cout << tmp_rs << endl;
for(int j = 0; j < I.size(); j++){
string tmp_is = to_string(I[j]);
if(isExist(tmp_is, tmp_rs)){
//cout << j << " ";
mp[tmp_rs].push_back(make_pair(tmp_is, j));
}
}
}
vector<string> res;
for(int i = 0; i < R.size(); i++){
for(auto item = mp.begin(); item != mp.end(); item++){
if(item->first == to_string(R[i])){
res.push_back(item->first);
int baohanNum = item->second.size();
res.push_back(to_string(baohanNum));
for(int idx = 0; idx < baohanNum; idx++){
res.push_back(to_string(item->second[idx].second));
res.push_back(item->second[idx].first);
}
}
}
}
cout << res.size() << " ";
for(auto x : res){
cout << x << " ";
}
cout << endl;
}
int main(){
int m = 0, n = 0;
cin >> m;
vector<int> I(m, 0);
for(int i = 0; i < m; i++){
int num = 0;
cin >> num;
I[i] = num;
}
cin >> n;
vector<int> R(n);
for(int i = 0; i < n; i++){
int num = 0;
cin >> num;
R[i] = num;
}
process(m, n, I, R);
return 0;
}
26.字符串排序
#include<bits/stdc++.h>
using namespace std;
int main(){
string str = "";
getline(cin, str);
char out[1000];
int k = 0;
for(int i = 0; i <= 26; i++){ //
for(int j = 0; j < str.size(); j++){
if(str[j] - 'a' == i || str[j] - 'A' == i){ //
out[k++] = str[j];//out中存放的便是按照顺序的字符串
}
}
}
//for(int i = 0; i < strlen(out); i++)
//cout<<out[i];
k = 0;
for(int i = 0; i < str.size(); i++){
if(isalpha(str[i])){
str[i] = out[k++]; //
}
}
cout<<str<<endl;
return 0;
}
27.查找兄弟单词
#include <bits/stdc++.h>
using namespace std;
void process(int wordsNum, int& ans, string& res){
vector<string> vecStr(wordsNum, "");
for(int i = 0; i < wordsNum; i++){
string s = "";
cin >> s;
vecStr[i] = s;
}
string word = "";
cin >> word;
int k = 0;
cin >> k;
unordered_map<string, vector<string>> m;
string w = word;
sort(w.begin(), w.end());
for(int i = 0; i < vecStr.size(); i++){
string tmp = vecStr[i];
sort(tmp.begin(), tmp.end());
if(tmp == w && vecStr[i] != word){
m[word].push_back(vecStr[i]);
//cout << vecStr[i]<<endl;
}
}
sort(m[word].begin(), m[word].end());
ans = m[word].size();
if(k < ans){ //
res = m[word][k - 1];
}
return;
}
int main(){
int wordsNum = 0;
int ans = 0;
string res = "";
while(cin >> wordsNum){
process(wordsNum, ans, res);
cout << ans << endl;
if(res != ""){ //
cout << res << endl;
}
}
return 0;
}
28.素数伴侣
#include <bits/stdc++.h>
using namespace std;
//判断一个数是否是素数
bool isPrime(int num){
for(int i = 2; i * i <= num; i++){
if(num % i == 0){
return false;
}
}
return true;
}
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(){
int n = 0;
cin >> n;
vector<int> nums(n);
vector<int> odds; //奇数数组
vector<int> evens; //偶数数组
for(int i = 0; i < n; i++){
cin >> nums[i];
if(nums[i] % 2 != 0) odds.push_back(nums[i]); //奇数数组
else evens.push_back(nums[i]); //偶数数组
}
int count = 0; //(只能是一个奇数一个偶数才可以构成素数伴侣)
if(odds.size() == 0 || evens.size() == 0){
cout << count << endl; //缺少奇数或者偶数无法构成素数伴侣
}
else{
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;
}
29.字符串加解密
#include <bits/stdc++.h>
using namespace std;
//encoder
void encoder(string str){
for(int i = 0; i < str.size(); i++){
if(isalpha(str[i])){
if(str[i] >= 'a' && str[i] <= 'z'){//小写字母
if(str[i] == 'z') str[i] = 'A';
else{
str[i] = str[i] - 'a' + 'A' + 1;//变换大小写同时用后一个字母替换
}
}
else{
if(str[i] == 'Z') str[i] = 'a';
else{
str[i] = str[i] - 'A' + 'a' + 1;//变换大小写同时用后一个字母替换
}
}
}
else if(isdigit(str[i])){
if(str[i] == '9') str[i] = '0';
else{
str[i] = str[i] + 1;
}
}
}
cout << str << endl;
}
//decoder
void decoder(string str){
for(int i = 0; i < str.size(); i++){
if(isalpha(str[i])){
if(str[i] >= 'a' && str[i] <= 'z'){//小写字母
if(str[i] == 'a') str[i] = 'Z';
else{
str[i] = str[i] - 'a' + 'A' - 1;//变换大小写同时用后一个字母替换
}
}
else{
if(str[i] == 'A') str[i] = 'z';
else{
str[i] = str[i] - 'A' + 'a' - 1;//变换大小写同时用后一个字母替换
}
}
}
else if(isdigit(str[i])){
if(str[i] == '0') str[i] = '9';
else{
str[i] = str[i] - 1;
}
}
}
cout << str << endl;
}
int main(){
string yao_jia_mi_str = "";
cin >> yao_jia_mi_str;
string jia_guo_mi_str = "";
cin >> jia_guo_mi_str;
encoder(yao_jia_mi_str);
decoder(jia_guo_mi_str);
return 0;
}
30.字符串合并处理
#include <bits/stdc++.h>
using namespace std;
//char Intput[] = {"0123456789abcdefABCDEF"}; //输入参照字典(数字 + 大小写字母)
//int Output[] = "084c2a6e195d3b7f5d3b7f"; //输出参照字典(小写)
//char Output[] = {"084C2A6E195D3B7F5D3B7F"}; //输出参照字典(数字 + 大写字母)
unordered_map<char, char> mp = {
{'0', '0'},
{'1', '8'},
{'2', '4'},
{'3', 'C'},
{'4', '2'},
{'5', 'A'},
{'6', '6'},
{'7', 'E'},
{'8', '1'},
{'9', '9'},
{'a', '5'},
{'b', 'D'},
{'c', '3'},
{'d', 'B'},
{'e', '7'},
{'f', 'F'},
{'A', '5'},
{'B', 'D'},
{'C', '3'},
{'D', 'B'},
{'E', '7'},
{'F', 'F'}
};
void process(string s1, string s2, string& res){
//合并
string s = s1 + s2;
//排序
string odds = "", evens = "";
for(int i = 0; i < s.size(); i++){
if(i % 2 == 0){
evens += s[i];
}
else{
odds += s[i];
}
}
sort(odds.begin(), odds.end());//cout << odds << endl;
sort(evens.begin(), evens.end());//cout << evens << endl;
int idx = 0; string newS = "";
while(idx < odds.size() || idx < evens.size()){
if(idx < evens.size()) newS += evens[idx];
if(idx < odds.size()) newS += odds[idx];
idx++;
}
//cout << newS << endl;
//转换(直接建立哈希表,键为转换前,值为转换后)
//哈希表中存在进行转换,否则保留原字符
for(int i = 0; i < newS.size(); i++){
if(mp.find(newS[i]) != mp.end()){
newS[i] = mp[newS[i]];
}
}
res = newS;
}
int main(){
string s1 = "", s2 = "";
while(cin >> s1 >> s2){
string res = "";
process(s1, s2, res);
cout << res << endl;
}
return 0;
}
最后
以上就是愤怒路人为你收集整理的牛客网——华为题库(21~30)21.简单密码22.汽水瓶23.删除字符串中出现次数最少的字符24.合唱队25.数据分类处理26.字符串排序27.查找兄弟单词28.素数伴侣29.字符串加解密30.字符串合并处理的全部内容,希望文章能够帮你解决牛客网——华为题库(21~30)21.简单密码22.汽水瓶23.删除字符串中出现次数最少的字符24.合唱队25.数据分类处理26.字符串排序27.查找兄弟单词28.素数伴侣29.字符串加解密30.字符串合并处理所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复