题目描述:
按照指定规则对输入的字符串进行处理。
详细描述:
将输入的两个字符串合并。
对合并后的字符串进行排序,要求为:下标为奇数的字符和下标为偶数的字符分别从小到大排序。这里的下标意思是字符在字符串中的位置。
对排序后的字符串进行操作,如果字符为‘0’——‘9’或者‘A’——‘F’或者‘a’——‘f’,则对他们所代表的16进制的数进行BIT倒序的操作,并转换为相应的大写字符。如字符为‘4’,为0100b,则翻转后为0010b,也就是2。转换后的字符为‘2’; 如字符为‘7’,为0111b,则翻转后为1110b,也就是e。转换后的字符为大写‘E’。
输入:输入两个字符串
dec fab
输出描述:输出转化后的结果
5D37BF
做题思路:
- 首先,合并成一个字符串s
- 遍历s,下标为偶数的字符放到名为even的vector当中,下标为奇数的放到名为odd的vector当中
- 利用sort对两个vector进行排序
- 对于单个字符,使用isalpha和isdigit判断是否为字母或数字,如果是,就对其进行转换,switch直接一一对应就好了,不用再自己去考虑如何转换为8421码再颠倒。
- 对排序好的odd和even交叉着对字符进行转换并输出即可
AC代码:
#include<iostream>
#include<string>
#include<vector>
#include<cctype>
#include<algorithm>
using namespace std;
char transC(char c);
int main()
{
string s1,s2;
while( cin>>s1>>s2 ){
string s = s1+s2;
vector<char> even; //记录下标为偶数的字符
vector<char> odd; //记录下标为奇数的字符
for(int i=0; i<s.size(); i++){
if( i%2==0 ){
even.push_back(s[i]);
}else{
odd.push_back(s[i]);
}
}
sort(odd.begin(),odd.end());
sort(even.begin(),even.end());
int len = odd.size()<even.size()?odd.size():even.size(); //找出两者之间更短的那个
for(int i=0; i<len; i++){
cout<<transC(even[i])<<transC(odd[i]);
}
if( odd.size()<even.size() ){
cout<<transC(even[even.size()-1]);
}
if( odd.size()>even.size() ){
cout<<transC(odd[odd.size()-1]);
}
cout<<endl;
}
return 0;
}
char transC(char c)
{
if( isdigit(c)||isalpha(c) ){
switch(c){
case '0': c='0'; break;
case '1': c='8'; break;
case '2': c='4'; break;
case '3': c='C'; break;
case '4': c='2'; break;
case '5': c='A'; break;
case '6': c='6'; break;
case '7': c='E'; break;
case '8': c='1'; break;
case '9': c='9'; break;
case 'A': case 'a': c='5'; break;
case 'B': case 'b': c='D'; break;
case 'C': case 'c': c='3'; break;
case 'D': case 'd': c='B'; break;
case 'E': case 'e': c='7'; break;
case 'F': case 'f': c='F'; break;
default: break;
}
}
return c;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)