题解 | #字符串合并处理#

字符串合并处理

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;
    }
}

全部评论

相关推荐

10-25 12:05
已编辑
湖南科技大学 Java
若梦难了:我有你这简历,已经大厂乱杀了
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务