题解 | #字符串合并处理#

字符串合并处理

http://www.nowcoder.com/practice/d3d8e23870584782b3dd48f26cb39c8f

大体流程如下:

  1. 手动定义后面可能用得到的字符转换hash表。
  2. 声明两个<char,int>类型的map对象,分别用来记录输出的string中奇数下标和偶数下标字符出现的次数。
  3. 声明一个变量来记录下一个遍历的字符下标的奇偶,遍历两个string,并将字符插入相应的map中。
  4. 每插一个对应于字符在map中的计数加一。
  5. 完成两个string的字符在map中的计数后,依次将两个map中的元素轮流push到输入字符串中。
  6. 插入前需要检查是否需要进行转换,需要则利用hash表索引转换值,否则直接插入。
  7. 打印结果的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;
}
全部评论

相关推荐

无敌虾孝子:喜欢爸爸还是喜欢妈妈
点赞 评论 收藏
分享
头像
10-09 19:35
门头沟学院 Java
洛必不可达:java的竞争激烈程度是其他任何岗位的10到20倍
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务