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

字符串合并处理

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

全部评论

相关推荐

那一天的Java_J...:他本来公司就是做这个的,不就是正常的游戏客户端和服务器开发,软硬件联动,有啥恶心不恶心的,提前告诉你就是怕你接受不了,接受不了就没必要再往后走流程浪费时间,虽然这公司是一坨。
点赞 评论 收藏
分享
05-11 11:48
河南大学 Java
程序员牛肉:我是26届的双非。目前有两段实习经历,大三上去的美团,现在来字节了,做的是国际电商的营销业务。希望我的经历对你有用。 1.好好做你的CSDN,最好是直接转微信公众号。因为这本质上是一个很好的展示自己技术热情的证据。我当时也是烂大街项目(网盘+鱼皮的一个项目)+零实习去面试美团,但是当时我的CSDN阅读量超百万,微信公众号阅读量40万。面试的时候面试官就告诉我说觉得我对技术挺有激情的。可以看看我主页的美团面试面经。 因此花点时间好好做这个知识分享,最好是单拉出来搞一个板块。各大公司都极其看中知识落地的能力。 可以看看我的简历对于博客的描述。这个帖子里面有:https://www.nowcoder.com/discuss/745348200596324352?sourceSSR=users 2.实习经历有一些东西删除了,目前看来你的产出其实很少。有些内容其实很扯淡,最好不要保留。有一些点你可能觉得很牛逼,但是面试官眼里是减分的。 你还能负责数据库表的设计?这个公司得垃圾成啥样子,才能让一个实习生介入数据库表的设计,不要写这种东西。 一个公司的财务审批系统应该是很稳定的吧?为什么你去了才有RBAC权限设计?那这个公司之前是怎么处理权限分离的?这些东西看着都有点扯淡了。 还有就是使用Redis实现轻量级的消息队列?那为什么这一块不使用专业的MQ呢?为什么要使用redis,这些一定要清楚, 就目前看来,其实你的这个实习技术还不错。不要太焦虑。就是有一些内容有点虚了。可以考虑从PR中再投一点产出
投递美团等公司9个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务