華為機試 字串合併處理 全域性變數使用前初始化
阿新 • • 發佈:2021-02-05
技術標籤:刷題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
注意:所有的全域性變數每次使用前記得初始化,這裡的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;
}