題目描述
按照指定規(guī)則對(duì)輸入的字符串進(jìn)行處理。
詳細(xì)描述:
將輸入的兩個(gè)字符串合并。
對(duì)合并后的字符串進(jìn)行排序,要求為:下標(biāo)為奇數(shù)的字符和下標(biāo)為偶數(shù)的字符分別從小到大排序。這里的下標(biāo)意思是字符在字符串中的位置。
對(duì)排序后的字符串進(jìn)行操作,如果字符為‘0’——‘9’或者‘A’——‘F’或者‘a(chǎn)’——‘f’,則對(duì)他們所代表的16進(jìn)制的數(shù)進(jìn)行BIT倒序的操作,并轉(zhuǎn)換為相應(yīng)的大寫(xiě)字符。如字符為‘4’,為0100b,則翻轉(zhuǎn)后為0010b,也就是2。轉(zhuǎn)換后的字符為‘2’; 如字符為‘7’,為0111b,則翻轉(zhuǎn)后為1110b,也就是e。轉(zhuǎn)換后的字符為大寫(xiě)‘E’。
舉例:輸入str1為"dec",str2為"fab",合并為“decfab”,分別對(duì)“dca”和“efb”進(jìn)行排序,排序后為“abcedf”,轉(zhuǎn)換后為“5D37BF”
輸入描述:輸入兩個(gè)字符串
輸出描述:輸出轉(zhuǎn)化后的結(jié)果
示例:
輸入:dec fab
輸出:5D37BF
題目本身難度不大,細(xì)節(jié)處理比較多,合并給定的兩個(gè)字符串,并按照奇偶位置分別排序,再將排序后的兩個(gè)奇偶序列重新合并,這部分比較簡(jiǎn)單,合并的過(guò)程中可以按照題意對(duì)每個(gè)滿足要求的字符進(jìn)行進(jìn)一步的處理,返回處理的結(jié)果加入新的結(jié)果字符串。對(duì)單個(gè)滿足要求的字符進(jìn)行如下處理:
- 判斷當(dāng)前字符是不是16進(jìn)制字符,不是則直接加入新的結(jié)果串,是的話需要進(jìn)行2~4中的;
- 首先將16進(jìn)制字符轉(zhuǎn)換為4位的二進(jìn)制形式,例如字符為‘4’,轉(zhuǎn)換為0100;
16進(jìn)制轉(zhuǎn)換為4位二進(jìn)制形式可以使用bitset類(lèi)完成,例如:
bitset<n> b(x)將十進(jìn)制整數(shù)x轉(zhuǎn)換為n位的二進(jìn)制形式,因此這里需要先將16進(jìn)制字符轉(zhuǎn)換為十進(jìn)制整數(shù),可以使用stoi()函數(shù)實(shí)現(xiàn),stoi()函數(shù)原型為:int stoi (const string& str, size_t* idx = 0, int base = 10),第一個(gè)參數(shù)是要轉(zhuǎn)換的字符串,如果是char類(lèi)型要顯示轉(zhuǎn)換為string類(lèi)型,第二個(gè)參數(shù)不用管,一般使用空指針就可以了,第三個(gè)參數(shù)指示源字符串的基數(shù)。注意stoi()的返回類(lèi)型是int,但是可以隱式轉(zhuǎn)換為char類(lèi)型。 - 再將二進(jìn)制轉(zhuǎn)換為字符串,例如0100轉(zhuǎn)換為“0100”,這是為了完成題目中要求的翻轉(zhuǎn)操作,將0100翻轉(zhuǎn)為“0010”;
具體的操作方法為:bitset類(lèi)對(duì)象調(diào)用類(lèi)成員函數(shù)to_string()將bitset類(lèi)對(duì)象轉(zhuǎn)換為string對(duì)象,再利用reverse()函數(shù)完成翻轉(zhuǎn)操作。 - 對(duì)翻轉(zhuǎn)后的二進(jìn)制字符串還要轉(zhuǎn)化為對(duì)應(yīng)的16進(jìn)制字符,如果轉(zhuǎn)換后的字符是a~f,還要轉(zhuǎn)換為大寫(xiě)形式。
二進(jìn)制字符串轉(zhuǎn)換為對(duì)應(yīng)的16進(jìn)制字符可以使用字符流stringstream完成,同樣需要先使用stoi(str,nullptr,2)將二進(jìn)制字符串str轉(zhuǎn)換為對(duì)應(yīng)的十進(jìn)制整數(shù)。
#include<iostream>
#include<string>
#include<bitset>
#include<algorithm>
#include<sstream>
#include<cctype>
using namespace std;
char m_transform(char c)
{
//十六進(jìn)制字符轉(zhuǎn)換為4位二進(jìn)制形式
bitset<4> b(std::stoi(string(1,c),nullptr,16)); //stoi(string(1,c),nullptr,16)將string類(lèi)型16進(jìn)制數(shù)轉(zhuǎn)換位10進(jìn)制整數(shù)
string b2s=b.to_string(); //二進(jìn)制轉(zhuǎn)string類(lèi)型
reverse(begin(b2s),end(b2s)); //翻轉(zhuǎn)字符串
//用字符流將翻轉(zhuǎn)后的二進(jìn)制字符串轉(zhuǎn)為對(duì)應(yīng)的16進(jìn)制字符
stringstream ss;
ss<<std::hex<<std::stoi(b2s,nullptr,2); //stoi(b2s,nullptr,2)將二進(jìn)制字符串轉(zhuǎn)換為對(duì)應(yīng)的十進(jìn)制整數(shù)
char res;
ss>>res;
if(isalpha(res)) return toupper(res);
return res;
}
void handler(string a,string b)
{
string res = a+b;
string odd;
string even;
int len =res.length();
for(int i=0;i<len;++i)
{
if(i%2==0){
even+=res[i];
}
else{
odd+=res[i];
}
}
sort(begin(odd),end(odd));
sort(begin(even),end(even));
// cout<<odd<<endl;
// cout<<even<<endl;
for(int i=0,j=0,k=0;k<len;++k){
if(k%2==0){
// 異常處理
if((even[i]>='0' && even[i]<='9') || (even[i]>='a' && even[i]<='f') || (even[i]>='A' && even[i]<='F')){
res[k]=m_transform(even[i++]);
}
else{
res[k]=even[i++];
}
}
else{
if((odd[j]>='0' && odd[j]<='9') || (odd[j]>='a' && odd[j]<='f') || (odd[j]>='A' && odd[j]<='F')){
res[k]=m_transform(odd[j++]);
}
else{
res[k]=odd[j++];
}
}
}
cout<<res<<endl;
}
int main(int argc,char **argv)
{
string a,b;
while(cin>>a>>b){
handler(a,b);
}
return 0;
}
注意細(xì)節(jié):
- C++ char轉(zhuǎn)string
char c;
string s(c);
這是不對(duì)的,單個(gè)字符轉(zhuǎn)string需要指定長(zhǎng)度,詳情看string類(lèi)構(gòu)造函數(shù)(6)的形式:

stoi()可以解析str,將其內(nèi)容解釋為指定基數(shù)的整數(shù)值,并將其返回為int值,也就是可以將任意進(jìn)制的字符串轉(zhuǎn)為10進(jìn)制整型數(shù)。-
cctype頭文件聲明一組函數(shù),可以對(duì)單個(gè)字符進(jìn)行分類(lèi)和轉(zhuǎn)換,很方便,再也不用自己寫(xiě)函數(shù)判斷給定字符是不是字符或者數(shù)字。
cctype頭文件聲明的字符分類(lèi)、轉(zhuǎn)換函數(shù)
