avatar
fireworks99
keep hungry keep foolish

HJ30 字符串合并处理

题目描述

第一步:将输入的两个字符串str1和str2进行前后合并。如给定字符串 “dec” 和字符串 “fab” , 合并后生成的字符串为 “decfab”

第二步:对合并后的字符串进行排序,要求为:下标为奇数的字符和下标为偶数的字符分别从小到大排序。这里的下标的意思是字符在字符串中的位置。注意排序后在新串中仍需要保持原来的奇偶性。例如刚刚得到的字符串“decfab”,分别对下标为偶数的字符’d’、’c’、’a’和下标为奇数的字符’e’、’f’、’b’进行排序(生成 ‘a’、’c’、’d’ 和 ‘b’ 、’e’ 、’f’),再依次分别放回原串中的偶数位和奇数位,新字符串变为“abcedf”

第三步:对排序后的字符串中的’0’~’9’、’A’~’F’和’a’~’f’字符,需要进行转换操作。

转换规则如下:

对以上需要进行转换的字符所代表的十六进制用二进制表示并倒序,然后再转换成对应的十六进制大写字符(注:字符 a~f 的十六进制对应十进制的10~15,大写同理)。

如字符 ‘4’,其二进制为 0100 ,则翻转后为 0010 ,也就是 2 。转换后的字符为 ‘2’。

如字符 ‘7’,其二进制为 0111 ,则翻转后为 1110 ,对应的十进制是14,转换为十六进制的大写字母为 ‘E’。

如字符 ‘C’,代表的十进制是 12 ,其二进制为 1100 ,则翻转后为 0011,也就是3。转换后的字符是 ‘3’。

根据这个转换规则,由第二步生成的字符串 “abcedf” 转换后会生成字符串 “5D37BF”。

数据范围:输入的字符串长度满足 1 <= n <= 100

示例

输入

ab CD

输出

3B5D

思路

按照题目描述去做即可,有几个知识点:

  1. 使用sort方法对字符串按照ASCII码排序sort(even.begin(), even.end());

  2. 借助map的初始化完成二进制与十六进制的转换

    map<char, string> _16To2 = { {'0', "0000"}, {'1', "0001"}, {'2', "0010"}, {'3', "0011"}, {'4', "0100"}, {'5', "0101"}, {'6', "0110"}, {'7', "0111"}, {'8', "1000"}, {'9', "1001"}, {'A', "1010"}, {'B', "1011"}, {'C', "1100"}, {'D', "1101"}, {'E', "1110"}, {'F', "1111"}, {'a', "1010"}, {'b', "1011"}, {'c', "1100"}, {'d', "1101"}, {'e', "1110"}, {'f', "1111"} }; map<string, char> _2To16 = { {"0000", '0'}, {"0001", '1'}, {"0010", '2'}, {"0011", '3'}, {"0100", '4'}, {"0101", '5'}, {"0110", '6'}, {"0111", '7'}, {"1000", '8'}, {"1001", '9'}, {"1010", 'A'}, {"1011", 'B'}, {"1100", 'C'}, {"1101", 'D'}, {"1110", 'E'}, {"1111", 'F'} };
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
  3. 借助reverse方法对字符串进行翻转reverse(binary_num.begin(), binary_num.end());

Code

#include <map> #include <cstdio> #include <string> #include <iostream> #include <algorithm> using namespace std; int main() { // 打开 input.txt 文件并重定向标准输入流 freopen("00input.txt", "r", stdin); // 打开 output.txt 文件并重定向标准输出流 // freopen("00output.txt", "w", stdout); string a, b; while(cin >> a >> b) { //第一步:合并 string c = a + b; //第二步:排序 string even = "", odd = ""; int sz = c.size(); for(int i = 0; i < sz; ++i) { if(i % 2 == 0) { even += c[i]; } else { odd += c[i]; } } sort(even.begin(), even.end()); sort(odd.begin(), odd.end()); string afterSort = ""; int e_index = 0, o_index = 0, index = 0; while (afterSort.size() < sz) { afterSort += index++ % 2 == 0 ? even[e_index++] : odd[o_index++]; } // cout << afterSort << '\n'; //第三步:替换 string ans = ""; map<char, string> _16To2 = { {'0', "0000"}, {'1', "0001"}, {'2', "0010"}, {'3', "0011"}, {'4', "0100"}, {'5', "0101"}, {'6', "0110"}, {'7', "0111"}, {'8', "1000"}, {'9', "1001"}, {'A', "1010"}, {'B', "1011"}, {'C', "1100"}, {'D', "1101"}, {'E', "1110"}, {'F', "1111"}, {'a', "1010"}, {'b', "1011"}, {'c', "1100"}, {'d', "1101"}, {'e', "1110"}, {'f', "1111"} }; map<string, char> _2To16 = { {"0000", '0'}, {"0001", '1'}, {"0010", '2'}, {"0011", '3'}, {"0100", '4'}, {"0101", '5'}, {"0110", '6'}, {"0111", '7'}, {"1000", '8'}, {"1001", '9'}, {"1010", 'A'}, {"1011", 'B'}, {"1100", 'C'}, {"1101", 'D'}, {"1110", 'E'}, {"1111", 'F'} }; for(int i = 0; i < sz; ++i) { if(afterSort[i] >= '0' && afterSort[i] <= '9' || afterSort[i] >= 'A' && afterSort[i] <= 'F' || afterSort[i] >= 'a' && afterSort[i] <= 'f') { string binary_num = _16To2[ afterSort[i] ]; reverse(binary_num.begin(), binary_num.end()); char hex_num = _2To16[ binary_num ]; ans += hex_num; } else { ans += afterSort[i]; } } cout << ans << '\n'; } return 0; }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72

补充

前端开发写JS跟C语言相比,有一点明显不同:JS的方法都定义在原型上,C语言的方法是独立定义的。

比如数组的sort方法,在JS里是arr.sort(),在C语言里是sort(arr, arr + n)

在JS里同一名称的方法针对不同的this在对象的原型里有自己的定义。

在C语言里同一方法针对不同的参数有不同的实现,比如sort参数为数组时,参数为vector等其他容器时,参数为string等,称为函数重载

Site by Baole Zhao | Powered by Hexo | theme PreciousJoy