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;
}
标签:temp,int,合并,++,ji,str,字符串,ou,HJ30 来源: https://blog.csdn.net/free_girl_fang/article/details/119080616