字符串合并處理:C++ bitset庫(kù)和stoi()函數(shù)實(shí)踐


題目描述
按照指定規(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)行如下處理:

  1. 判斷當(dāng)前字符是不是16進(jìn)制字符,不是則直接加入新的結(jié)果串,是的話需要進(jìn)行2~4中的;
  2. 首先將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)型。
  3. 再將二進(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)操作。
  4. 對(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é):

  1. C++ char轉(zhuǎn)string
char c;
string s(c);

這是不對(duì)的,單個(gè)字符轉(zhuǎn)string需要指定長(zhǎng)度,詳情看string類(lèi)構(gòu)造函數(shù)(6)的形式:


string類(lèi)的構(gòu)造函數(shù)
  1. stoi()可以解析str,將其內(nèi)容解釋為指定基數(shù)的整數(shù)值,并將其返回為int值,也就是可以將任意進(jìn)制的字符串轉(zhuǎn)為10進(jìn)制整型數(shù)。

  2. cctype頭文件聲明一組函數(shù),可以對(duì)單個(gè)字符進(jìn)行分類(lèi)和轉(zhuǎn)換,很方便,再也不用自己寫(xiě)函數(shù)判斷給定字符是不是字符或者數(shù)字。

    cctype頭文件聲明的字符分類(lèi)、轉(zhuǎn)換函數(shù)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容