牛客网 - 在线编程 - 华为机试 - 字符串处理

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

详细描述:

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

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

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

C++:

#include<iostream>
#include<string>
#include"math.h"
#include<algorithm>
using namespace std;

string presort(string);
char process(char a);
int main()
{
    string s, s1, s2;
    while (cin >> s1)
    {
        cin.get();
        cin >> s2;
        s = presort(s1+s2);
        string output = "";
        for (int i = 0; i < s.size(); i++)
        {
            if (s[i] >= '0' && s[i] <= '9' || s[i] >= 'A' && s[i] <= 'F' || s[i] >= 'a' && s[i] <= 'f')
            {
                s[i] = process(s[i]);
            }
            output += s[i];
        }
        cout << output << endl;
    }
    return 0;
}
string presort(string s)
{
    string s1, s2;
    s1 = ""; s2 = "";
    string result = "";
    for (int i = 0; i < s.size(); i++)
    {
        if (i % 2 == 0)
            s1 += s[i];
        else
            s2 += s[i];
    }
    sort(s1.begin(), s1.end());
    sort(s2.begin(), s2.end());
    int n = s.size();
    if (n % 2 == 0)
    {
        for (int i = 0; i < s1.size(); i++)
        {
            result += s1[i];
            result += s2[i];
        }

    }
    else
    {
        for (int i = 0; i < s2.size(); i++)
        {
            result += s1[i];
            result += s2[i];
        }
        result += s1[s2.size()];
    }
    return result;
}
int ch2int(char a)
{
    int b = 0;
    if (a >= '0' && a <= '9')
        b = a - '0';
    else if (a >= 'a'&&a <= 'f')
        b = a - 'a' + 10;
    else if (a >= 'A'&&a <= 'F')
        b = a - 'A' + 10;
    return b;
}
int reverse_ten2two(int a)
{
    int ch[4] = { 0 };
    int sum = 0;
    for (int i = 0; i < 4; i++)
    {
        ch[i] = a % 2;
        a /= 2;
        sum += ch[i] * pow(2, 3 - i);
    }
    return sum;
}
char int2ch(int a)
{
    char b;
    if (a >= 0 && a <= 9)
        b = a + '0';
    else if (a >= 10 &&a <= 15)
        b = a - 10 + 'A';
    return b;
}
char process(char a)
{
    int i = ch2int(a);
    int ri = reverse_ten2two(i);
    char b = int2ch(ri);
    return b;
}

Python:

while True:
    try:
        def preinput(s):
            s = s.replace(' ','')
            a = ''; b = '';
            for i,v in enumerate(s): #这边可以直接a = s[::2],b=a[1::2]
                if i % 2 == 0:
                    a = a + v
                else:
                    b = b + v
            a = ''.join(sorted(a))
            b = ''.join(sorted(b))
            result = ''
            for i in range(len(b)):
                result = result + a[i]
                result = result + b[i]
            if(len(a) - len(b)):
                result += a[len(b)]
            return result

        def transform(a):
            if '0' <= a <= '9':
                a = int(a)
            elif 'a' <= a <= 'f':  #这里可以直接对a.upper()进行判断,减少一次条件判断
                a = ord(a) - ord('a') + 10
            elif 'A' <= a <= 'F':
                a = ord(a) - ord('A') + 10
            a = bin(a).lstrip('0b')
            if(len(a) < 4):  #这边可以直接s.rjust(4,'0')
                a = (4 - len(a)) * '0' + a
            a = a[::-1]
            sum = 0
            for i,v in enumerate(a):
                sum = sum + int(v) * pow(2, 3 - i)
            a = sum
            if a > 9:  
                a = chr(a - 10 + ord('A'))
            else:
                a = '%s'%a
            return a
        s = input()
        a = preinput(s)
        s = ""
        for i,v in enumerate(a):
            if '0' <= v <= '9' or 'a' <= v <= 'f' or 'A' <= v <= 'F':
                s = s + transform(v)
            else:
                s = s + v
        print(s)
    except:
        pass

猜你喜欢

转载自blog.csdn.net/qq_39735236/article/details/82257543