题解 | #字符串合并处理#
字符串合并处理
https://www.nowcoder.com/practice/d3d8e23870584782b3dd48f26cb39c8f
import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String str1 = input.next();
String str2 = input.next();
strMergeDetail(str1, str2);
}
private static void strMergeDetail(String str1, String str2) {
// 1.拼接
String str = str1 + str2;
List<Character> str1Chars = new ArrayList<>();
List<Character> str2Chars = new ArrayList<>();
for (int i = 0; i < str.length(); i++) {
if (i % 2 == 0) {
str1Chars.add(str.charAt(i));
} else {
str2Chars.add(str.charAt(i));
}
}
Collections.sort(str1Chars);
Collections.sort(str2Chars);
// 2.排序
List<Character> strMerge = new ArrayList<>();
int m = 0;
int k = 0;
for (int i = 0; i < str.length(); i++) {
if (i % 2 == 0) {
strMerge.add(str1Chars.get(m));
m++;
} else {
strMerge.add(str2Chars.get(k));
k++;
}
}
// 3. 进制转换
// 输入特殊处理字符
Map<Character, Integer> hashCharMap = new HashMap<>();
hashCharMap.put('A', 10);
hashCharMap.put('B', 11);
hashCharMap.put('C', 12);
hashCharMap.put('D', 13);
hashCharMap.put('E', 14);
hashCharMap.put('F', 15);
// 输出特殊处理字符
Map<Integer, Character> hashNumberMap = new HashMap<>();
hashNumberMap.put(10, 'A');
hashNumberMap.put(11, 'B');
hashNumberMap.put(12, 'C');
hashNumberMap.put(13, 'D');
hashNumberMap.put(14, 'E');
hashNumberMap.put(15, 'F');
for (int i = 0; i < strMerge.size(); i++) {
char tmp = strMerge.get(i); // 依次获取list的值
if (tmp >= '0' && tmp <= '9') { // 如果十数字字符
StringBuilder re = new StringBuilder();
StringBuilder binaryCode = toBinary(Integer.parseInt(String.valueOf(tmp)),
re).reverse();
StringBuilder add = new StringBuilder();
for (int j = 0; j < 4 - binaryCode.length(); j++) {
add.append("0");
}
add.append(binaryCode);
int result = 0;
int num = toInt(add.reverse().toString(), 2, result);
if (num >= 0 && num <= 9) { // 此时判断应用数字,int num
System.out.print(num);
} else {
System.out.print(hashNumberMap.get(num));
}
} else if ((tmp >= 'a' && tmp <= 'f' || tmp >= 'A' &&
tmp <= 'F')) { // 字母字符,统一转为大写,然后对应 定义好的map
int num = hashCharMap.get(Character.toUpperCase(tmp));
StringBuilder re = new StringBuilder();
StringBuilder binaryCode = toBinary(num, re).reverse();
int result = 0;
int key = toInt(binaryCode.reverse().toString(), 2, result);
if (key >= 0 && key <= 9) {
System.out.print(key);
} else {
System.out.print(hashNumberMap.get(key));
}
} else {
System.out.print(tmp);
}
}
}
/**
* 十进制转其他进制
* 此方法得到的结果需要 反转一次 得到对应的二进制(由于题目要求得到的二进制还需要反转,所以上述代码反转了两次,其实本体可以不反转,用此法得到的恰好是题目需要的反转的二进制)
* @param number 十进制数
* @param strBuilder 二进制结果(需要反转才是该十进制数对应的二进制)
* @return 输入十进制数的二进制的反转
*/
public static StringBuilder toBinary(int number, StringBuilder strBuilder) {
if (number == 0) {
return strBuilder;
} else {
strBuilder.append(number % 2);
toBinary(number / 2, strBuilder);
}
return strBuilder;
}
/**
* 其他进制转换为十进制
*
* @param stringCode 二进制数
* @param base 基数
* @param result 十进制数
* @return 十进制数
*/
public static int toInt(String stringCode, int base, int result) {
int j = 0;
for (int i = stringCode.length() - 1; i >= 0; i--) {
int tmp = (int) (Integer.parseInt(String.valueOf(stringCode.charAt(
i))) * Math.pow(base, j));
result = result + tmp;
j++;
}
return result;
}
}
查看11道真题和解析
顺丰集团工作强度 318人发布
