您的位置:首页 > 其它

华为训练题:中级——合并字符串

2015-08-11 22:31 288 查看
按照指定规则对输入的字符串进行处理。

详细描述:

将输入的两个字符串合并。

对合并后的字符串进行排序,要求为:下标为奇数的字符和下标为偶数的字符分别从小到大排序。这里的下标意思是字符在字符串中的位置。

对排训后的字符串进行操作,如果字符为‘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”

接口设计及说明:

/*

功能:字符串处理

输入:两个字符串,需要异常处理

输出:合并处理后的字符串,具体要求参考文档

返回:无

*/

void ProcessString(char* str1,char *str2,char * strOutput)

{

}

知识点字符串,排序,位运算
运行时间限制10M
内存限制128
输入输入两个字符串

输出输出转化后的结果

样例输入dec fab
样例输出5D37BF
#include<iostream>
#include<string>
using namespace std;

char daoxu(char ch)
{
if((ch>='0'&&ch<='9')||(ch>='A'&&ch<='F')||(ch>='a'&&ch<='f'))
{
if(ch>='0'&&ch<='9')
{
switch(ch)
{
case '0':
return '0';
case '1':
return '8';
case '2':
return '4';
case '3':
return 'C';
case '4':
return '2';
case '5':
return 'A';
case '6':
return '6';
case '7':
return 'E';
case '8':
return '1';
case '9':
return '9';
}
}
if(ch>='A'&&ch<='F')
{
switch(ch)
{
case 'A':
return '5';
case 'B':
return 'D';
case 'C':
return '3';
case 'D':
return 'B';
case 'E':
return '7';
case 'F':
return 'F';
}
}
if(ch>='a'&&ch<='f')
{
switch(ch)
{
case 'a':
return '5';
case 'b':
return 'D';
case 'c':
return '3';
case 'd':
return 'B';
case 'e':
return '7';
case 'f':
return 'F';
}
}
}
else
return ch;
}

void paixu(string& str)
{
int len=str.size();
if(len==1)
return ;
for(int i=0;i<len-1;i++)
for(int j=i+1;j<len;j++)
if(str[i]>str[j])
{
char temp=str[i];
str[i]=str[j];
str[j]=temp;
}
return;
}

string ProcessString1(string& str)
{
int i=0;
string str1=str;

if(str1.empty())
return str1;

int len=str1.size();

if(len==1)
{
str1[0]=daoxu(str1[0]);
return str1;
}

if(len==2)
{
str1[0]=daoxu(str1[0]);
str1[1]=daoxu(str1[1]);
return str1;
}

string str2,str3;
for(int i=0;i<len;i+=2)
str2.push_back(str1[i]);
paixu(str2);
for(int i=1;i<len;i+=2)
str3.push_back(str1[i]);
paixu(str3);

if(len%2==0)
{
str1.clear();
int len_str2=str2.size();
for(int i=0;i<len_str2;i++)
{
str1.push_back(str2[i]);
str1.push_back(str3[i]);
}
}

if(len%2!=0)
{
str1.clear();
int len_str3=str3.size();
for(int i=0;i<len_str3;i++)
{
str1.push_back(str2[i]);
str1.push_back(str3[i]);
}
str1.push_back(str2[str2.size()-1]);
}

for(int i=0;i<len;i++)
str1[i]=daoxu(str1[i]);
return str1;
}

int main()
{
string s;
getline(cin,s);
int i;
int len_s=s.size();
for(i=0;i<len_s;i++)
{
if(s[i]==' ')
break;
}

for(int j=i;j<len_s-1;j++)
s[j]=s[j+1];

string str;
for(int i=0;i<len_s-1;i++)
str.push_back(s[i]);

str=ProcessString1(str);
cout<<str<<endl;

system("pause");
}


char daoxu(char ch);这个函数可以不用上面列举的case方法,可以采用位运算

先位与运算,取出那一位,然后位移进行倒序,再合起来位或还原成一个数

char daoxu2(char ch)
{
if((ch>='0'&&ch<='9')||(ch>='A'&&ch<='F')||(ch>='a'&&ch<='f'))
{
if(ch>='A'&&ch<='F')
ch=ch-'A'+10;
if(ch>='a'&&ch<='f')
ch=ch-'a'+10;
ch=((ch&1)<<3)|((ch&2)<<1)|((ch&4)>>1)|((ch&8)>>3);

if(ch>=0&&ch<=9)
{
ch=ch+'0';
return ch;
}
else
{
ch=ch-10+'A';
return ch;
}
}
else
return ch;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: