題目描述
將輸入的兩個字符串合併。
對合並後的字符串進行排序,要求爲:下標爲奇數的字符和下標爲偶數的字符分別從小到大排序。這裏的下標意思是字符在字符串中的位置。
對排序後的字符串進行操作,如果字符爲‘0’——‘9’或者‘A’——‘F’或者‘a’——‘f’,則對他們所代表的16進制的數進行BIT倒序的操作,並轉換爲相應的大寫字符。如字符爲‘4’,爲0100b,則翻轉後爲0010b,也就是2。轉換後的字符爲‘2’; 如字符爲‘7’,爲0111b,則翻轉後爲1110b,也就是e。轉換後的字符爲大寫‘E’。
舉例:輸入str1爲”dec”,str2爲”fab”,合併爲“decfab”,分別對“dca”和“efb”進行排序,排序後爲“abcedf”,轉換後爲“5D37BF”
說明:
排序:利用動態數組存放偶串和奇串(方法1),如果容器使用不熟練,也可以使用string(方法2),
轉換:
方法1:
#include<iostream>
#include<string> //字符串處理
#include<algorithm> //排序
#include<vector> //動態數組用於存放奇偶子串
using namespace std;
//排序
vector<char> Sort(string str)
{
vector<char> odd_str,even_str;
int i;
for(i=0;i<str.size();i+=2)
{
even_str.push_back(str[i]);//偶數位置子串
if(i+1<str.size())
odd_str.push_back(str[i+1]);//奇數位置子串
}
sort(even_str.begin(),even_str.end());
sort(odd_str.begin(),odd_str.end());
vector<char>final_str;
for(i=0;i<even_str.size();i++)
{
final_str.push_back(even_str[i]);
if(i<odd_str.size())
final_str.push_back(odd_str[i]);
}
return final_str;
}
//轉換
vector<char> Convert(vector<char> &c)
{
vector<char> result;
char conv[16]={'0','8','4','C','2','A','6','E','1','9','5','D','3','B','7','F'};
char temp;
for(int i=0;i<c.size();i++)
{
if(c[i]>='0' && c[i]<='9')//數字
temp=conv[c[i]-'0'];
else if(c[i]>='a' && c[i]<='f')
temp=conv[c[i]-'a'+10];
else if(c[i]>='A' && c[i]<='F')
temp=conv[c[i]-'A'+10];
else
temp=c[i];
result.push_back(temp);
}
return result;
}
int main()
{
string s1,s2;
while(cin>>s1>>s2)
{
string merge_str=s1+s2;//合併
vector<char> mystr=Convert(Sort(merge_str));
for(int i=0;i<mystr.size();i++)
cout<<mystr[i];
cout<<endl;
}
return 0;
}
方法2:
string Sort(string str)
{
string odd_str,even_str;
int i;
for(i=0;i<str.size();i++)
{
if(i%2==0)
even_str+=str[i];//偶數位置子串
else
odd_str+=str[i+1];//奇數位置子串
}
//排序,默認升序
sort(even_str.begin(),even_str.end());
sort(odd_str.begin(),odd_str.end());
for(i=0;i<str.size();i++)
{
if(i%2==0)
str+=even_str[i/2];
else
str+=odd_str[i/2];
}
return str;
}