HJ30 字符串合并处理

描述
按照指定规则对输入的字符串进行处理。

详细描述:

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

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

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

注意本题含有多组样例输入

输入描述:
本题含有多组样例输入。每组样例输入两个字符串,用空格隔开。

输出描述:
输出转化后的结果。每组样例输出一行。

示例1
输入:
dec fab
复制
输出:
5D37BF
下面展示一些 内联代码片

// A code block
var foo = 'bar';
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
using namespace std;
string sort_str(string str);
int turn(int n);
int turn(int n)
{
    vector<int>x;
    while (n)
    {
        int a;
        a = n % 2;
        n = n / 2;
        x.push_back(a);
    }
    int len = 4 - x.size();
    while (len)
    {
        x.push_back(0);
        len--;
    }
    int res = 0;
    for (int i = 0; i < 4; i++)
    {
        res = res * 2 + x[i];
    }
    return res;

}
string sort_str(string str)
{
    vector<char>ji;
    vector<char>ou;
    int len = str.size();
    for (int i = 0; i < len; i++)
    {
        if ((i + 1) % 2 == 1)
            ji.push_back(str[i]);
        else
            ou.push_back(str[i]);
    }
    sort(ji.begin(), ji.end());
    sort(ou.begin(), ou.end());
    int ji_index = 0;
    int ou_index = 0;
    for (int i = 0; i < len; i++)
    {
        if ((i + 1) % 2 == 1)
        {
            str[i] = ji[ji_index];
            ji_index++;
        }
        else
        {
            str[i] = ou[ou_index];
            ou_index++;
        }

    }


    return str;
}
int main()
{
    string str1, str2;
    while (cin >> str1 >> str2)
    {
       
        string str = sort_str(str1 + str2);
        for (int i = 0; i < str.size(); i++)
        {
            if (str[i] >= '0' && str[i] <= '9')
            {
                int temp = (int)str[i];
                temp = turn(temp);
                if (temp >= 10 && temp <= 15)
                {
                    str[i] = temp - 10 + 'A';
                }
                else
                    str[i] = temp+'0';
            }
            else
            {
                int temp = str[i] - 'a' + 10;
                temp = turn(temp);
                if (temp >= 10 && temp <= 15)
                {
                    str[i] = temp - 10 + 'A';
                }
                else
                    str[i] = temp + '0';
            }
        }


        cout << str << endl;




    }






    return 0;
}

此代码会超限,因为内存是32M
该题其实有一定的技巧,就是1-9 a-f转换后字符是确定的,那么就可以直接构建一个1-15的数组,每次直接调用,而不是一致循环计算,
下面展示一些 内联代码片

该题有坑,就是输入不仅仅局限a-f,其他的时候也需要判断
另外大写小写最后都转换成响应的大写
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
using namespace std;
int p[16];
string sort_str(string str);
int turn(int n);
char pan(int temp);
vector<int>x;
vector<char>ji;
vector<char>ou;
char pan(int temp)
{
    if (temp >= 10 && temp <= 15)
        return (temp - 10 + 'A');
    else
        return(temp + '0');
}
int turn(int n)
{
    x.clear();
    while (n)
    {
        int a;
        a = n % 2;
        n = n / 2;
        x.push_back(a);
    }
    int len = 4 - x.size();
    while (len)
    {
        x.push_back(0);
        len--;
    }
    int res = 0;
    for (int i = 0; i < 4; i++)
    {
        res = res * 2 + x[i];
    }
    return res;

}
string sort_str(string str)
{
    ji.clear();
    ou.clear();
    int len = str.size();
    for (int i = 0; i < len; i++)
    {
        if ((i + 1) % 2 == 1)
            ji.push_back(str[i]);
        else
            ou.push_back(str[i]);
    }
    sort(ji.begin(), ji.end());
    sort(ou.begin(), ou.end());
    int ji_index = 0;
    int ou_index = 0;
    for (int i = 0; i < len; i++)
    {
        if ((i + 1) % 2 == 1)
        {
            str[i] = ji[ji_index];
            ji_index++;
        }
        else
        {
            str[i] = ou[ou_index];
            ou_index++;
        }

    }


    return str;
}
int main()
{
    //首先搭建16位转换字符
    for (int i = 0; i < 16; i++)
    {
        int temp = turn(i);
        p[i] = temp;
    }
    string str1, str2;
    while (cin >> str1 >> str2)
    {
        string str = sort_str(str1 + str2);
        for (int i = 0; i < str.size(); i++)
        {
            if (str[i] >= '0' && str[i] <= '9')
            {
                int temp = p[str[i] - '0'];
                str[i] = pan(temp);
            }
            else if(str[i] >= 'a' && str[i] <= 'f')
            {
                int temp = p[str[i] - 'a' + 10];
                str[i] = pan(temp);
            }
            else if (str[i] >= 'A' && str[i] <= 'F')
            {
                int temp = p[str[i] - 'A' + 10];
                str[i] = pan(temp);
            }
        }
        cout << str << endl;

    }

    return 0;
}
上一篇:[译] 为何前端开发如此不稳定


下一篇:域***测试指南之GPO和OU详解(上)