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

字符串合并处理

https://www.nowcoder.com/practice/d3d8e23870584782b3dd48f26cb39c8f

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner fzhinput = new Scanner(System.in);
        String srzfc[] = new String[2];
        StringBuilder stack = new StringBuilder();

        // 输入两个字符串并拼接
        for (int i = 0; i < 2; i++) {
            srzfc[i] = fzhinput.next();
            stack.append(srzfc[i]);
        }
        String zfc = stack.toString();

        // 将偶数位和奇数位的字符分别存储
        ArrayList<Character> os = new ArrayList<>();
        ArrayList<Character> js = new ArrayList<>();
        for (int i = 0; i < zfc.length(); i++) {
            if (i % 2 == 0) {
                os.add(zfc.charAt(i));
            } else {
                js.add(zfc.charAt(i));
            }
        }

        // 对偶数位和奇数位字符分别排序
        Collections.sort(os);
        Collections.sort(js);

        // 根据原顺序重新组合排序后的字符
        int x = 0, y = 0;
        stack.setLength(0);  // 清空stack用于重新构造
        for (int i = 0; i < zfc.length(); i++) {
            if (i % 2 == 0) {
                stack.append(os.get(x++));
            } else {
                stack.append(js.get(y++));
            }
        }

        // 处理排序后的字符串
        String jz16 = stack.toString();
        StringBuilder fzstack = new StringBuilder();
        for (int i = 0; i < jz16.length(); i++) {
            char ch = jz16.charAt(i);
            // 检查是否为有效的十六进制字符
            if (isHexadecimal(ch)) {
                // 将十六进制字符转换为数值
                int a = Integer.parseInt(Character.toString(ch), 16);

                // 将数值转换为4位二进制字符串
                String erjz = Integer.toBinaryString(a);
                while (erjz.length() < 4) {  // 确保每个二进制字符串是4位长
                    erjz = "0" + erjz;
                }

                // 翻转二进制字符串
                String reversedErjz = new StringBuilder(erjz).reverse().toString();
                fzstack.append(reversedErjz).append("|");
            } else {
                // 保留非十六进制字符原样
                fzstack.append(ch).append("|");
            }
        }

        // 将处理过的二进制字符串按'|'分割
        String[] dclerjz = fzstack.toString().split("\\|");
        for (int i = 0; i < dclerjz.length; i++) {
            if (!dclerjz[i].isEmpty() && isBinary(dclerjz[i])) { // 跳过空字符串或非二进制字符
                // 将翻转后的二进制字符串转换回十进制数
                int a = Integer.parseInt(dclerjz[i], 2);

                // 将十进制数转换为大写十六进制字符
                String sixteenjz = Integer.toString(a, 16).toUpperCase();

                // 输出最终结果
                System.out.print(sixteenjz);
            } else {
                // 对于非十六进制字符直接输出原字符
                System.out.print(dclerjz[i]);
            }
        }
    }

    // 判断字符是否为十六进制字符
    public static boolean isHexadecimal(char ch) {
        return (ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'f') || (ch >= 'A' && ch <= 'F');
    }

    // 判断字符串是否为合法的二进制数
    public static boolean isBinary(String s) {
        return s.matches("[01]+");
    }
}

全部评论

相关推荐

07-07 12:47
门头沟学院 Java
码农索隆:竟然还真有卡体检报告的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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