题意:
按照如下规则操作:
方法一:
模拟
思路:直接模拟。
第一步:直接合并字符串;
第二步:分别对下标为奇数的字符和下标为偶数的字符分别从小到大排序;第三步:对排序后的字符串中的'0'~'9'、'A'~'F'和'a'~'f'字符进行操作:先将字符表示为二进制串,再逆向二进制串转化为对应的十六进制大写字符。
![]()
#include <bits/stdc++.h> using namespace std; int main(){ string s1,s2,s; while(cin >> s1 >> s2){ string a="",b=""; s=s1+s2;//字符串合并 int len=s.size(); for(int i=0;i<len;i++){ if(i%2==0) a+=s[i]; else b+=s[i]; } sort(a.begin(),a.end());//下标为偶数的字符排序 sort(b.begin(),b.end());//下标为奇数的字符排序 int j=0; for(int i=0;i<len;i++){ if(i%2==0) s[i]=a[j]; else s[i]=b[j++]; } // cout << s << endl; for(int i=0;i<len;i++){ if(isdigit(s[i])||(s[i]>='a'&&s[i]<='f')||(s[i]>='A'&&s[i]<='F')){//字符转换 string c=""; if(s[i]>='a')//字母统一转为大写字母 s[i]-=32; int num; if(isalpha(s[i]))//如果是字母 num=s[i]-'A'+10; else//如果是数字 num=s[i]-'0'; string x=""; while(num){//转为二进制形式 x+=num%2+'0'; num/=2; } while(x.size()<4){ x+='0'; } int y=0; for(int i=0;i<x.size();i++){//逆向运算 y=y*2+x[i]-'0'; } if(y>9) s[i]='A'+y-10; else s[i]=y+'0'; } } cout << s << endl; } return 0; }
时间复杂度:
空间复杂度:![]()
方法二:
map排序
思路:利用map的有序性,可以实现排序的功能。构造两个map,分别对下标为奇数的字符和下标为偶数的字符分别从小到大排序。最后遍历每个字符进行同方法一 一样的操作。
#include <bits/stdc++.h> using namespace std; int main(){ string s1,s2,s; while(cin >> s1 >> s2){ map<pair<char,int>,int> m1; map<pair<char,int>,int> m2; string a="",b=""; s=s1+s2;//字符串合并 int len=s.size(); for(int i=0;i<len;i++){ if(i%2==0) m1[{s[i],i}]=1;//下标为偶数的字符排序 else m2[{s[i],i}]=1;//下标为奇数的字符排序 } map<pair<char,int>,int>::iterator it1=m1.begin(); map<pair<char,int>,int>::iterator it2=m2.begin(); for(int i=0;i<len;i++){ if(i%2==0) s[i]=it1->first.first,it1++; else s[i]=it2->first.first,it2++; } // cout << s << endl; for(int i=0;i<len;i++){ if(isdigit(s[i])||(s[i]>='a'&&s[i]<='f')||(s[i]>='A'&&s[i]<='F')){//字符转换 string c=""; if(s[i]>='a')//字母统一转为大写字母 s[i]-=32; int num; if(isalpha(s[i]))//如果是字母 num=s[i]-'A'+10; else//如果是数字 num=s[i]-'0'; string x=""; while(num){//转为二进制形式 x+=num%2+'0'; num/=2; } while(x.size()<4){ x+='0'; } int y=0; for(int i=0;i<x.size();i++){//逆向运算 y=y*2+x[i]-'0'; } if(y>9) s[i]='A'+y-10; else s[i]=y+'0'; } } cout << s << endl; } return 0; }
时间复杂度:
空间复杂度:![]()