华为训练题:中级——合并字符串
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; }
相关文章推荐
- POJ 3177 Redundant Paths
- linux下scp 、ssh非22端口的服务器操作
- 图算法之拓扑排序
- leetcode 99: Recover Binary Search Tree
- Rapid Environment Editor
- 黑马程序员——继承
- iOS + Nodejs SSL/Https双向认证
- Linux(cent OS)用户管理-配置文件-用户信息文件
- POJ 1699 Best Sequence (TSP之dp状态压缩+KMP计算主串前缀匹配子串后缀)
- 桶排序
- android 页面跳转,数据回传
- 网卡添加VLAN TAG
- [Usaco2007 Dec][BZOJ1690] 奶牛的旅行|分数规划|二分|SPFA
- hdu 3076 ssworld VS DDD(概率dp)
- HDOJ 5375 Gray code DP
- 2012华为机试第三题引发的关于“java传值,传引用”思考
- Leetcode: Binary Search Tree Iterator
- [笔记][Java7并发编程实战手册]系列目录
- SSH常用命令选项
- [程序员面试金典]1002.下一个较大元素