题解 | #字符串合并处理#
字符串合并处理
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; } }