1. 程式人生 > 其它 >華為機試 字串合併處理 全域性變數使用前初始化

華為機試 字串合併處理 全域性變數使用前初始化

技術標籤:刷題again

題目描述

按照指定規則對輸入的字串進行處理。

詳細描述:

將輸入的兩個字串合併。

對合並後的字串進行排序,要求為:下標為奇數的字元和下標為偶數的字元分別從小到大排序。這裡的下標意思是字元在字串中的位置。

對排序後的字串進行操作,如果字元為‘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

輸入

dec fab

輸出

5D37BF

題目連結:https://www.nowcoder.com/practice/d3d8e23870584782b3dd48f26cb39c8f?tpId=37&tqId=21253&rp=1&ru=%2Fta%2Fhuawei&qru=%2Fta%2Fhuawei%2Fquestion-ranking&tab=answerKey

注意:所有的全域性變數每次使用前記得初始化,這裡的tmp1,tmp2一定要一定要。

#include<bits/stdc++.h>
using namespace std;
int main()
{
    string str1="",str2="",res,tmp1,tmp2;
    while(cin>>str1>>str2)
    {
        res=str1+str2;
        int len=res.size();
        tmp1="",tmp2="";//它們是全域性變數,使用前記得清空,切記切記
        for(int i=1;i<len;i+=2)
        {
            tmp1+=res[i];
        }
        for(int i=0;i<len;i+=2)
        {
            tmp2+=res[i];
        }
        sort(tmp1.begin(),tmp1.end());
        sort(tmp2.begin(),tmp2.end());
        int c1=0,c2=0;
//         cout<<res.size()<<"="<<tmp1.size()<<"+"<<tmp2.size()<<endl;
        for(int i=0;i<len;i++)
        {
            if(i%2==1)
            {
                res[i]=tmp1[c1++];
            }
            else
            {
                res[i]=tmp2[c2++];
            }
//             cout<<res[i];
            int sum=0;
            if(res[i]>='0'&&res[i]<='9')
            {
                int num=res[i]-'0';
                for(int j=0;j<4;j++)
                {
                    if(num&1)
                    {
                        sum=sum*2+1;
                    }
                    else
                    {
                        sum=sum*2;
                    }
                    num=num>>1;
                }
//                 res[i]=('0'+sum);
            }
            else if(res[i]>='A'&&res[i]<='F')
            {
                int num=res[i]-55;
                for(int j=0;j<4;j++)
                {
                    if(num&1)
                    {
                        sum=sum*2+1;
                    }
                    else
                    {
                        sum=sum*2;
                    }
                    num=num>>1;
                }
            }
            else if(res[i]>='a'&&res[i]<='f')//  1010--->  0101
            {
                int num=res[i]-87;
                for(int j=0;j<4;j++)
                {
                    if(num&1)
                    {
                        sum=sum*2+1;
                    }
                    else
                    {
                        sum=sum*2;
                    }
                    num=num>>1;
                }
            }
            else
            {
                continue;
            }
            if(sum>=0&&sum<=9)
            {
                res[i]=('0'+sum);
            }
            else
            {
                res[i]=(55+sum);
            }
        }
        cout<<res<<endl;
        res="",str1="",str2="";
    }
    return 0;
}

之前有些字元轉換的題目,我看不少人都提前做好一張轉換表,直接轉換更快,但我一直沒那樣做,這次試一下,這樣確實更快,因為轉換一次,下次就直接查表就好了 。當然這張表不可能是自己手算的,也是根據上面的程式碼直接生成的表。

#include<bits/stdc++.h>
using namespace std;
int main()
{
    const string helper1="0123456789abcdefABCDEF";
    const string helper2="084C2A6E195D3B7F5D3B7F";
    string str1="",str2="";
    while(cin>>str1>>str2)
    {
        string res=str1+str2;
        string tmp1,tmp2;
        int len=res.size();
        for(int i=0;i<len;i++)
        {
            if(i%2==1)
            {
                tmp1+=res[i];//tmp1存放奇數位置字元
            }
            else
            {
                tmp2+=res[i];//tmp2存放偶數位置字元
            }
        }
        sort(tmp1.begin(),tmp1.end());
        sort(tmp2.begin(),tmp2.end());
        int c1=0,c2=0;
        for(int i=0;i<len;i++)
        {
            if(i%2==1)
            {
                res[i]=tmp1[c1++];
            }
            else
            {
                res[i]=tmp2[c2++];
            }
            int n=helper1.find(res[i]);
            if(n!=-1)
            {
                res[i]=helper2[n];
            }
        }
        cout<<res<<endl;
        str1="",str2="";
    }
    return 0;
}