一、试题地址
字符串合并处理_牛客题霸_牛客网
二、试题内容
描述:
定义“调整”操作为,对于一个十进制数字,将其转换为二进制数,翻转,再转换为十六进制数(大写)。例如,(4)10(4)10 对应的二进制数为 (100)2(100)2 ,翻转后得到 (001)2(001)2 ,再转换为十六进制数为 (1)16(1)16 。
对于给定的仅由小写字母 a-fa-f 、大写字母 A-FA-F 、数字 0-90-9 构成的字符串 ss 和 tt ,请按照以下步骤进行处理:
- 第一步,将 ss 和 tt 合并,形成一个新字符串 uu 。
- 第二步,将 uu 中奇数位字符从小到大进行排序,随后将偶数位字符也从小到大进行排序,得到 u′u′ 。
- 第三步,对 u′u′ 中的字符依次转换为十进制数,随后执行“调整”操作。
输出最终的字符串。
输入描述:
在一行上输入两个长度 1≦length(s),length(t)≦1001≦length(s),length(t)≦100 ,仅由小写字母 a-fa-f 、大写字母 A-FA-F 、数字 0-90-9 构成的字符串 ss 和 tt ,代表待处理的字符串。
输出描述:
在一行上输出一个字符串,代表最终的字符串。
示例1:
输入:
dec fab输出:
5D37BF说明:
在这个样例中,第一步合并后得到 u="decfab"u="decfab" ;第二步,排序得到 u′="abcedf"u′="abcedf" ;随后,按位转换为十进制数,并执行“调整”操作: ∙ ∙对于第一个字符 ("a")16("a")16 ,其十进制数为 (10)10(10)10 ,二进制数为 (1010)2(1010)2 ,翻转后得到 (0101)2(0101)2 ,再转换回十六进制数为 (5)16(5)16 ; ∙ ∙对于第二个字符 ("b")16=(11)10=(1011)2("b")16=(11)10=(1011)2 ,翻转后得到 (1101)2=(D)16(1101)2=(D)16 ; ∙ ∙对于第三个字符 ("c")16=(12)10=(1100)2("c")16=(12)10=(1100)2 ,翻转后得到 (0011)2=(3)16(0011)2=(3)16 ; ∙ ∙对于第四个字符 ("e")16=(14)10=(1110)2("e")16=(14)10=(1110)2 ,翻转后得到 (0111)2=(7)16(0111)2=(7)16 ; ∙ ∙对于第五个字符 ("d")16=(13)10=(1101)2("d")16=(13)10=(1101)2 ,翻转后得到 (1011)2=(B)16(1011)2=(B)16 ; ∙ ∙对于第六个字符 ("f")16=(15)10=(1111)2("f")16=(15)10=(1111)2 ,翻转后得到 (1111)2=(F)16(1111)2=(F)16 。
示例2:
输入:
ab CD输出:
3B5D说明:
在这个样例中,第一步合并后得到 u="abCD"u="abCD" ;第二步,排序得到 u′="CDab"u′="CDab" 。需要特别注意的是,这里的排序是按照 AsciiAscii 码表的顺序进行排序的。
示例3:
输入:
123 15输出:
88C4A
示例4:
输入:
Eqr v9oEb12U2ur4xu7rd931G1f50qDo
输出:
8084842CAE9B9G7D7BUFooqqrrrvuxu
三、运行要求
试题等级:较难 通过率:22.77% 时间限制:1秒 空间限制:32M
四、参考代码
package xu.com.coder.test3;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
public class Exam30 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNext()) {
String str1 = in.nextLine();
//去除掉里面的空格
str1 = str1.replaceAll("\\s+", "");
Character[] oddArrays = getOddStrings(str1);
Character[] evenArrays = getEvenStrings(str1);
//按照ascii码进行排序
Arrays.sort(oddArrays);
Arrays.sort(evenArrays);
Character[] str3Array = mergeArray(evenArrays, oddArrays);
for (char temp : str3Array) {
//如果不是十六进制以内的字符,则原样输出
try{
String binaryString = hexToBinary(Character.toString(temp));
//不足4位的前面补0使其满足4位长度
while (binaryString.length() < 4) {
binaryString = "0" + binaryString;
}
String reversed = new StringBuffer(binaryString).reverse().toString();
String reversedHex = binaryToHex(reversed);
System.out.print(reversedHex);
}catch (Exception e){
System.out.print(temp);
}
}
System.out.println();
}
in.close();
}
//交替合并两个数组,从第一个入参数组开始
public static Character[] mergeArray(Character[] array1, Character[] array2) {
Character[] result = new Character[array1.length + array2.length];
int i = 0, j = 0, k = 0;
while (i < array1.length && j < array2.length) {
result[k++] = array1[i++];
result[k++] = array2[j++];
}
// 如果array1有剩余元素,则将其全部添加到结果数组末尾
while (i < array1.length) {
result[k++] = array1[i++];
}
// 如果array2有剩余元素,则将其全部添加到结果数组末尾
while (j < array2.length) {
result[k++] = array2[j++];
}
return result;
}
//十六进制(字符串)转二进制(字符串)
public static String hexToBinary(String hexString) {
int decimal = Integer.parseInt(hexString, 16);
return Integer.toBinaryString(decimal);
}
// 二进制(字符串)转十六进制(字符串)
public static String binaryToHex(String binaryString) {
int decimal = Integer.parseInt(binaryString, 2);
return Integer.toHexString(decimal).toUpperCase();
}
//获取奇数位数据
private static Character[] getOddStrings(String input) {
char[] inputArray = input.toCharArray();
List<Character> characterList = new ArrayList<>();
for (int i = 1; i < inputArray.length; i += 2) {
characterList.add(inputArray[i]);
}
return characterList.toArray(new Character[]{});
}
//获取偶数位数据
private static Character[] getEvenStrings(String input) {
char[] inputArray = input.toCharArray();
List<Character> characterList = new ArrayList<>();
for (int i = 0; i < inputArray.length; i += 2) {
characterList.add(inputArray[i]);
}
return characterList.toArray(new Character[]{});
}
}