题解 | #字符串合并处理#
字符串合并处理
http://www.nowcoder.com/practice/d3d8e23870584782b3dd48f26cb39c8f
大体流程如下:
- 手动定义后面可能用得到的字符转换hash表。
- 声明两个<char,int>类型的map对象,分别用来记录输出的string中奇数下标和偶数下标字符出现的次数。
- 声明一个变量来记录下一个遍历的字符下标的奇偶,遍历两个string,并将字符插入相应的map中。
- 每插一个对应于字符在map中的计数加一。
- 完成两个string的字符在map中的计数后,依次将两个map中的元素轮流push到输入字符串中。
- 插入前需要检查是否需要进行转换,需要则利用hash表索引转换值,否则直接插入。
- 打印结果的string 思路清晰就能写出来,难度不是很大。
#include<iostream>
#include<string>
#include<map>
using namespace std;
int main(){
char cvrt[128]; // hash table for HEX conversion
char mp[]{'0','8','4','C','2','A','6','E','1','9','5','D','3','B','7','F'};
for(int i=0;i<10;i++)
cvrt['0'+i] = mp[i];
for(int i=0;i<7;i++)
cvrt['a'+i] = mp[10+i];
for(int i=0;i<7;i++)
cvrt['A'+i] = mp[10+i];
string str1, str2;
cin >> str1 >> str2;
map<char,int> m[2]; // 2 map was constructed to sort characters in odd or even index
int mi = 0; // alternate between 0 and 1 to select map[mi]
for(auto c:str1){ // add char in str1 into map
m[mi][c]++;
mi=1-mi;
}
for(auto c:str2){ // add ...
m[mi][c]++;
mi=1-mi;
}
string str3; // the result
auto it1 = m[0].begin(), it2 = m[1].begin();
while(it1!=m[0].end()){ // if chars in str1 are traversed out, so is str2.
if(it1->first>='0' && it1->first<='9' ||
it1->first>='a' && it1->first<='f'
||it1->first>='A' && it1->first<='F') // need conversion
str3.push_back(cvrt[it1->first]);
else // no need to convert
str3.push_back(it1->first);
if(--it1->second<=0)
it1++;
if(it2 == m[1].end()) // str2 might've been traversed out earlier than str1
break;
if(it2->first>='0' && it2->first<='9' ||
it2->first>='a' && it2->first<='f'
||it2->first>='A' && it2->first<='F') // chars in str2 need conversion?
str3.push_back(cvrt[it2->first]);
else // no need then just add it
str3.push_back(it2->first);
if(--it2->second <=0)
it2++;
}
cout << str3;
return 0;
}