首页 > 试题广场 >

字符串合并处理

[编程题]字符串合并处理
  • 热度指数:220219 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
\hspace{15pt}对于给定的由大小写字母和数字构成的字符串 st,记下标从 1 开始。按以下两个阶段进行处理:

\hspace{15pt}【合并阶段】
\hspace{23pt}\bullet\,第一步,将 st 合并,形成一个新字符串 u
\hspace{23pt}\bullet\,第二步,将 u 中奇数位字符按 Ascii 码从小到大(\texttt{`A'} \lt \texttt{`B'} \cdots \lt \texttt{`Z'} \lt \texttt{`a'} \lt \cdots \lt \texttt{`z'})进行排序,随后将偶数位字符也按 Ascii 码从小到大进行排序,得到 u'

\hspace{15pt}【调整阶段】
\hspace{15pt}随后,从左到右遍历 u' 中的每一个字符 u'_i
\hspace{23pt}\bullet\,第一步,若 u'_i 不是合法十六进制字符(即不为 \texttt{0-9}\texttt{a-f}\texttt{A-F}),则保留原字符,直接追加到结果中;否则,将其转换为十进制数。
\hspace{23pt}\bullet\,第二步,将该十进制数转换为四位二进制数(高位不足补 0,例如 (5)_{10}=(\texttt{0101})_2);
\hspace{23pt}\bullet\,第三步,将该二进制数翻转(反过来书写);
\hspace{23pt}\bullet\,第四步,将该二进制数转换为大写的十六进制数,追加到结果中。

\hspace{15pt}最终输出上述拼接而成的字符串。

输入描述:
\hspace{15pt}在一行上输入两个长度 1 \leqq {\rm length}(s), {\rm length}(t) \leqq 100,由大小写字母和数字构成的字符串 st,代表待处理的字符串。


输出描述:
\hspace{15pt}输出处理后的最终字符串。
示例1

输入

dec fab

输出

5D37BF

说明

\hspace{15pt}在这个样例中,全过程描述如下:
\hspace{15pt}【合并阶段】
\hspace{23pt}\bullet\,第一步合并得到 u = \texttt{
\hspace{23pt}\bullet\,第二步排序得到 u' = \texttt{
\hspace{15pt}【调整阶段】
\hspace{23pt}\bullet\,对于第一个字符 (\texttt{a})_{16},其十进制数为 (10)_{10},二进制数为 (\texttt{1010})_2,翻转后得到 (\texttt{0101})_2,再转换回十六进制数为 (\texttt{5})_{16}
\hspace{23pt}\bullet\,第二个字符 (\texttt{b})_{16}=(11)_{10}=(\texttt{1011})_2,翻转 (\texttt{1101})_2=(\texttt{D})_{16}
\hspace{23pt}\bullet\,第三个字符 (\texttt{c})_{16}=(12)_{10}=(\texttt{1100})_2,翻转 (\texttt{0011})_2=(\texttt{3})_{16}
\hspace{23pt}\bullet\,第四个字符 (\texttt{e})_{16}=(14)_{10}=(\texttt{1110})_2,翻转 (\texttt{0111})_2=(\texttt{7})_{16}
\hspace{23pt}\bullet\,第五个字符 (\texttt{d})_{16}=(13)_{10}=(\texttt{1101})_2,翻转 (\texttt{1011})_2=(\texttt{B})_{16}
\hspace{23pt}\bullet\,第六个字符 (\texttt{f})_{16}=(15)_{10}=(\texttt{1111})_2,翻转 (\texttt{1111})_2=(\texttt{F})_{16}
示例2

输入

abV CDw

输出

B3VD5w

说明

\hspace{15pt}在这个样例中,全过程描述如下:
\hspace{15pt}【合并阶段】
\hspace{23pt}\bullet\,第一步合并得到 u = \texttt{
\hspace{23pt}\bullet\,第二步排序得到 u' = \texttt{
\hspace{15pt}【调整阶段】
\hspace{23pt}\bullet\,对于第一个字符 (\texttt{D})_{16},其十进制数为 (13)_{10},二进制数为 (\texttt{1101})_2,翻转后得到 (\texttt{1011})_2=(\texttt{B})_{16}
\hspace{23pt}\bullet\,第二个字符 (\texttt{C})_{16}=(12)_{10}=(\texttt{1100})_2,翻转 (\texttt{0011})_2=(\texttt{3})_{16}
\hspace{23pt}\bullet\,第三个字符 (\texttt{V})_{16},跳过该字符;
\hspace{23pt}\bullet\,第四个字符 (\texttt{b})_{16}=(11)_{10}=(\texttt{1011})_2,翻转 (\texttt{1101})_2=(\texttt{D})_{16}
\hspace{23pt}\bullet\,第五个字符 (\texttt{a})_{16}=(10)_{10}=(\texttt{1010})_2,翻转 (\texttt{0101})_2=(\texttt{5})_{16}
\hspace{23pt}\bullet\,第六个字符 (\texttt{w})_{16},跳过该字符。
示例3

输入

123 15

输出

88C4A

说明

\hspace{15pt}在这个样例中,全过程描述如下:
\hspace{15pt}【合并阶段】
\hspace{23pt}\bullet\,第一步合并得到 u = \texttt{
\hspace{23pt}\bullet\,第二步排序得到 u' = \texttt{
\hspace{15pt}【调整阶段】
\hspace{23pt}\bullet\,对于第一、二个字符 (\texttt{1})_{10},其十进制数为 (1)_{10},二进制数为 (\texttt{0001})_2,翻转后得到 (\texttt{1000})_2,再转换回十六进制数为 (\texttt{8})_{16}
\hspace{23pt}\bullet\,第三个字符 (\texttt{3})_{16}=(3)_{10}=(\texttt{0011})_2,翻转 (\texttt{1100})_2=(\texttt{C})_{16}
\hspace{23pt}\bullet\,第四个字符 (\texttt{2})_{16}=(2)_{10}=(\texttt{0010})_2,翻转 (\texttt{0100})_2=(\texttt{4})_{16}
\hspace{23pt}\bullet\,第五个字符 (\texttt{5})_{16}=(5)_{10}=(\texttt{0101})_2,翻转 (\texttt{1010})_2=(\texttt{A})_{16}

备注:
本题已于下方时间节点更新,请注意题解时效性:
1. 2025-05-15 更新题面。
2. 2024-12-14 更新题面。
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String str = in.nextLine().replace(" ", "");
        char[] carr = str.toCharArray();
        for (int i = 0; i < carr.length; i += 2) {
            boolean isSorted = false;
            for (int j = 0; j < carr.length - 1 - i; j += 2) {
                if (j + 2 >= carr.length) break;
                if (carr[j] > carr[j + 2]) {
                    char tmp = carr[j];
                    carr[j] = carr[j + 2];
                    carr[j + 2] = tmp;
                    isSorted = true;
                }
            }
            if (!isSorted) break;
        }
        for (int i = 1; i < carr.length; i += 2) {
            boolean isSorted = false;
            for (int j = 1; j < carr.length - 1 - i; j += 2) {
                if (j + 2 >= carr.length) break;
                if (carr[j] > carr[j + 2]) {
                    char tmp = carr[j];
                    carr[j] = carr[j + 2];
                    carr[j + 2] = tmp;
                    isSorted = true;
                }
            }
            if (!isSorted) break;
        }
        for (int i = 0; i < carr.length; i++) {
            char c = carr[i];
            if (c >= '0' && c <= '9') {
                carr[i] = opNum(c - '0');
            } else if (c >= 'a' && c <= 'f') {
                carr[i] = opNum(c - 'a' + 10);
            } else if (c >= 'A' && c <= 'F') {
                carr[i] = opNum(c - 'A' + 10);
            }
        }
        System.out.println(new String(carr));
    }

    public static char opNum(int num) {
        int sum = 0;
        for (int i = 0; i < 4; i++) {
            int x = num % 2;
            num /= 2;
            sum += x * (int)Math.pow(2, 3-i);
        }
        return (char) (sum < 10 ? '0' + sum : 'A' + sum - 10);
    }
}
操作步骤能简化, 10进制转2进制时, 计算出的数字正好是逆序, 直接按这个顺序再2进制转16进制就行了

发表于 2026-01-10 21:14:20 回复(0)
import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String s = in.next();
        String t = in.next();
        String u = s + t;
        StringBuilder qiU = new StringBuilder();
        StringBuilder ouU = new StringBuilder();
        for (int i = 0; i < u.length(); i += 2) {
            qiU.append(u.charAt(i));
        }
        for (int i = 1; i < u.length(); i += 2) {
            ouU.append(u.charAt(i));
        }
        char[] qiUs = new String(qiU).toCharArray();
        char[] ouUs = new String(ouU).toCharArray();
        Arrays.sort(qiUs);
        Arrays.sort(ouUs);
        StringBuilder u1 = new StringBuilder();
        for (int i = 0; i < ouUs.length; i++) {
            u1.append(qiUs[i]).append(ouUs[i]);
        }
        if ((qiUs.length > ouUs.length)) {
            u1.append(qiUs[qiUs.length - 1]);
        }
        StringBuilder res = new StringBuilder();
        for (int i = 0; i < u1.length(); i++) {
            String temp = u1.substring(i, i + 1);
            if (temp.matches("[0-9a-fA-F]")) {
                StringBuilder bianaryStr = new StringBuilder(Integer.toBinaryString(
                            Integer.parseInt(temp, 16)));
                int len = bianaryStr.length();
                for (int j = 0; j < 4 - len; j++) {
                    bianaryStr.insert(0, "0");
                }
                bianaryStr =  bianaryStr.reverse();
                int ten = Integer.parseInt(bianaryStr.toString(), 2);
                String hex = Integer.toHexString(ten).toUpperCase();
                res.append(hex);
            }else{
                res.append(temp);
            }
        }
        System.out.println(res);
    }
}

发表于 2025-07-26 20:48:17 回复(0)
import java.util.*;
import java.math.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNext()) { // 注意 while 处理多个 case
            String a = in.next();
            String b = in.next();
            String str = a + b;
            String aa = sort(str);
            StringBuilder bd = new StringBuilder();
            for (int i = 0; i < aa.length() ; i++) {
                bd.append(changeJZ(aa.charAt(i)));
            }
            System.out.println(bd.toString());
        }
    }


    public static String sort(String s) {
        char[] js = new char[(s.length() + 1) / 2];
        char[] os = new char[s.length() / 2];
        int jn = 0, on = 0;
        for (int i = 0; i <  s.length(); i ++) {
            if (i % 2 == 0) {
                js[jn] = s.charAt(i);
                jn++;
            } else {
                os[on] = s.charAt(i);
                on++;
            }
        }
        Arrays.sort(js);
        Arrays.sort(os);
        StringBuilder bd = new StringBuilder();
        for (int i = 0; i < js.length ; i++) {
            bd.append(js[i]);
            if (i < os.length ) {
                bd.append(os[i]);
            }
        }
        return bd.toString();
    }

    public static String changeJZ(char ch) {
        if ((ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'f') ||  (ch >= 'A' &&
                ch <= 'F')) {

            BigInteger b1 = new BigInteger(String.valueOf(ch), 16);
            String s1 = b1.toString(2);
            if(s1.length()< 4){
                s1 = insertZero(s1);
            }
            StringBuilder bd = new StringBuilder();
            for (int i = s1.length() - 1; i >= 0; i--) {
                bd.append(s1.charAt(i));
            }
            BigInteger b2 = new BigInteger(bd.toString(), 2);
            String ss = b2.toString(16);
            return ss.toUpperCase();
        } else {
            return String.valueOf(ch);
        }

    }
    //补零,1,2,3这样的长度不够4位
    public static String insertZero(String s) {
        int n = 4 - s.length();
        StringBuilder bd = new StringBuilder();
        for (int i = 0; i < n; i++) {
            bd.append("0");
        }
        bd.append(s);
        return bd.toString();
    }
}

发表于 2025-07-12 17:17:24 回复(0)
import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    //16转10的map映射
    private static Map<Character, Integer> map16_10 = new
    HashMap<Character, Integer>() {
        {
            put('A', 10);
            put('B', 11);
            put('C', 12);
            put('D', 13);
            put('E', 14);
            put('F', 15);
            put('a', 10);
            put('b', 11);
            put('c', 12);
            put('d', 13);
            put('e', 14);
            put('f', 15);
        }
    };
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextLine()) { // 注意 while 处理多个 case
            String a = in.nextLine();//输入字符串
            a = a.replace(" ", ""); //将字符串中的空格去除
            char[] arrA = a.toCharArray();//转为char数组
            int n = arrA.length;
            //分别放入单数List和双数List,然后进行排序
            List<Character> oddList = new ArrayList<>();
            List<Character> evenList = new ArrayList<>();
            for (int i = 1; i <= n ; i++) {
                if (i % 2 == 0) {
                    evenList.add(arrA[i - 1]);
                } else {
                    oddList.add(arrA[i - 1]);
                }
            }
            //分别进行排序
            oddList.sort(Comparator.naturalOrder());
            evenList.sort(Comparator.naturalOrder());
            //将排序后的字符串取出
            StringBuilder sb = new StringBuilder();
            int odd = 0;
            int even = 0;
            for (int i = 1; i <= n ; i++) {
                if (i % 2 == 0) {
                    sb.append(evenList.get(even));
                    even++;
                } else {
                    sb.append(oddList.get(even));
                    odd++;
                }
            }
            StringBuilder result = new StringBuilder();
            //进行转换
            for (char c : sb.toString().toCharArray()) {
                char temp = c;
                //先判断是不是合法的16进制字符,合法则转换,不合法则直接追加
                if ((c >= '0' && c <= '9') ||  (c >= 'A' && c <= 'F') || (c >= 'a' &&
                        c <= 'f')) {
                    temp = change(c);
                }
                result.append(temp);//追加c到结果
            }
            //输出结果
            System.out.println(result.toString() );
        }
    }

    //转换
    private static char change(char c) {
        //1、十六进制转换为十进制
        int n ;
        if (Character.isDigit(c)) {
            n = Character.getNumericValue(c);//如果是数字,则直接转换为数字
        } else {
            n = map16_10.get(c) ; //非数字则通过map映射获取值
        }
        //2、将十进制转换为二进制
        String binary = Integer.toBinaryString(n);
        while (binary.length() % 4 != 0) { //不足4位的需要补0
            binary = "0" + binary;
        }
        //3、将二进制进行翻转
        StringBuilder sb  = new StringBuilder();
        //先翻转字符串
        for (int i = binary.length() - 1 ; i >= 0; i--) {
            sb.append(binary.toCharArray()[i]);
        }
        //4、将二进制转换为十六进制:先转十进制,再将十进制转为十六进制
        //将翻转后的字符串转为十进制的int类型
        int reverse = Integer.parseInt(sb.toString(), 2);
        //将十进制再转为十六进制,并转为大写
        String hex = Integer.toHexString(reverse).toUpperCase();
        char[] arr = hex.toCharArray();//直接输出
        if (arr.length == 1) {
            return arr[0];//一般只有一位,直接输出一位
        }
        return c;//兜底输出
    }
}

发表于 2025-06-24 19:26:01 回复(0)
import java.util.Scanner;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Arrays;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String s = bf.readLine();
// 合并后的字符串
String[] split = s.split(" ");
String slis = split[0] + split[1];
// 分割成两个字符串,分别排序,交替合并
char[] schar = slis.toCharArray();
int len = schar.length;
// 奇数个,奇偶长度不一样 偶数个,奇偶长度一样
int ji = 0;
int ou = 0;
if (len % 2 == 0) {
ji = len / 2;
ou = len / 2;
} else {
ji = len / 2;
ou = len / 2 + 1;
}
Character[] jiarr = new Character[ji];
Character[] ouarr = new Character[ou];
// 分成两部分 hello
int t = 0;
for (int i = 0; i < len; i = i + 2) {
ouarr[t] = schar[i];
t++;
}
int u = 0;
for (int i = 1; i < len; i = i + 2) {
jiarr[u] = schar[i];
u++;
}
// 对各个部分进行排序
// 手动处理列表
List<Character> jilis = new ArrayList<Character>();
for (int i = 0; i < jiarr.length; i++) {
jilis.add(jiarr[i]);
}
List<Character> oulis = new ArrayList<Character>();
for (int i = 0; i < ouarr.length; i++) {
oulis.add(ouarr[i]);
}
jilis.sort((o1, o2) -> o1.compareTo(o2));
oulis.sort((o1, o2) -> o1.compareTo(o2));
// 合并
Character[] new_arr = new Character[len];
// 填充数据
t = 0;
u = 0;
for (int i = 0; i < len; i++, u++) {
new_arr[i] = oulis.get(t);
t++;
i++;
if (u < jilis.size()) {
new_arr[i] = jilis.get(u);
}
// 处理奇偶数据
}
// 把16进制的转化为10进制的,再转化为2进制的,再反转,在转化为16进制的,再打印输出就可以了
for (int i = 0; i < len; i++) {
String num = Integer.toHexString(Integer.parseInt(new StringBuffer(
Integer.toBinaryString(Integer.parseInt(new_arr[i].toString(),
16))).reverse().toString(), 2)).toString();
;
System.out.print(num.toUpperCase());

}

}
}
发表于 2025-03-25 16:25:44 回复(2)
import java.util.Scanner;

import java.util.*;
import java.util.stream.Collectors;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String aa = in.nextLine();
        String bb = aa.replace(" ", "");
        String cc = "";
        String dd = "";
        String ee = "";
        for(int i = 0; i < bb.length(); i++) {
            if(i % 2 == 0) { //偶数
            cc += bb.charAt(i);
            } else { // 奇数
            dd += bb.charAt(i);
            }
        }
        List<String> list = Arrays.asList(cc.split("")); //偶数
        List<String> list1 = Arrays.asList(dd.split("")); // 奇数
        List<String> list2 = list1.stream().sorted().collect(Collectors.toList());
        List<String> list3 = list.stream().sorted().collect(Collectors.toList());
        int ff = list2.size();
        if(list3.size() > list2.size()) {
            ff = list3.size();
        }
        String ii = "";
        for(int j = 0; j < ff; j++) {
            String gg = "";
            String hh = "";
            if(j < list2.size()) {
                gg = list2.get(j);
            }
            if(j < list3.size()) {
                hh = list3.get(j);
            }
            ii += hh + gg;
        }
        StringBuilder sb = new StringBuilder();
        for(int k = 0; k < ii.length(); k++) {
            if(Character.toUpperCase(ii.charAt(k)) > 'F' && Character.toUpperCase(ii.charAt(k)) <= 'Z') {
                sb.append(ii.charAt(k));
                continue;
            }
            String tmp = hex2bin(ii.charAt(k) +"");
            String hex = bin2hex(new StringBuilder(tmp).reverse().toString());
            sb.append(hex.toUpperCase());
        }
        System.out.println(sb);
    }
    private static String hex2bin(String hex) {
        int tmp = Integer.parseInt(hex, 16);
        return String.format(Locale.ENGLISH, "%04d", Integer.parseInt(Integer.toBinaryString(tmp)));
    }

    private static String bin2hex(String bin) {
        int tmp = Integer.parseInt(bin, 2);
        return Integer.toHexString(tmp);
    }
}
发表于 2024-06-05 11:46:13 回复(0)
import java.util.Scanner;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            String str = scanner.next() + scanner.next();
            int oddsLength = str.length() / 2;
            int evensLength = str.length() % 2 == 0 ? str.length() / 2 : str.length() / 2 + 1;
            char[] odds = new char[oddsLength];
            char[] evens = new char[evensLength];
            int i1 = 0, i2 = 0;
            for (int i = 0; i < str.length(); i++) {
                if (i % 2 == 0) {
                    evens[i1++] = str.charAt(i);
                } else {
                    odds[i2++] = str.charAt(i);
                }
            }
            Arrays.sort(odds);
            Arrays.sort(evens);
            StringBuffer buffer = new StringBuffer();
            i1=0;i2=0;
            for (int i = 0; i < str.length(); i++) {
                if (i % 2 == 0) {
                    buffer.append(evens[i1++]);
                } else {
                    buffer.append(odds[i2++]);
                }
            }
            StringBuffer result = new StringBuffer();
            for(int i = 0; i<buffer.length(); i++) {
                int t=-1;
                char c = buffer.charAt(i);
                if (c >='0' && c <='9'){
                    t = c-'0';
                }else if (c >='A' && c <='F'){
                    t = c-'A'+10;
                }else if (c >='a' && c <='f'){
                    t = c-'a'+10;
                }
                if (t!=-1){
                    String s = Integer.toBinaryString(t);
                    while (s.length()<4){
                        s = '0'+s;
                    }

                    s = new StringBuffer(s).reverse().toString();
                    result.append(Integer.toHexString(Integer.parseInt(s, 2)).toUpperCase());
                }else{
                    result.append(buffer.charAt(i));
                }
            }
            System.out.println(result.toString());
        }
    }
}


编辑于 2024-04-07 12:19:19 回复(0)
import java.util.Scanner;
import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNextLine()) {
            String line = sc.nextLine();
            String[] arr = line.split(" ");
            String str = arr[0] + arr[1];
            List<Character> o = new ArrayList<>();
            List<Character> j = new ArrayList<>();
            for (int i = 0; i < str.length(); i++) {
                if (i % 2 == 0) {
                    o.add(str.charAt(i));
                } else {
                    j.add(str.charAt(i));
                }
            }
            Collections.sort(o);
            Collections.sort(j);
            Queue<Character> oq = new ArrayDeque<>(o);
            Queue<Character> jq = new ArrayDeque<>(j);
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < str.length(); i++) {
                if (i % 2 == 0) {
                    sb.append(oq.poll());
                } else {
                    sb.append(jq.poll());
                }
            }
            str = sb.toString();
            StringBuilder result = new StringBuilder();
            for (int i = 0; i < str.length(); i++) {
                if (Character.toUpperCase(str.charAt(i)) > 'F' && Character.toUpperCase(str.charAt(i)) <= 'Z') {
                    result.append(str.charAt(i));
                    continue;
                }
                String tmp = hex2bin(str.charAt(i) + "");
                String hex = bin2hex(new StringBuilder(tmp).reverse().toString());
                result.append(hex.toUpperCase());
            }
            System.out.println(result);
        }

    }

    private static String hex2bin(String hex) {
        int tmp = Integer.parseInt(hex, 16);
        return String.format(Locale.ENGLISH, "%04d", Integer.parseInt(Integer.toBinaryString(tmp)));
    }

    private static String bin2hex(String bin) {
        int tmp = Integer.parseInt(bin, 2);
        return Integer.toHexString(tmp);
    }
}

发表于 2024-03-16 22:57:04 回复(0)
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;


public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str = null;

        while ((str = br.readLine()) != null) {
            str = str.replace(" ", "");
            char[] chs = sort(str);
            System.out.println(transform(chs));
        }
    }

    private static char[] sort(String s) {
        char[] chs = s.toCharArray();
        doSort(chs, 2);
        doSort(chs, 3);
        return chs;
    }

    // 插入排序
    private static void doSort(char[] chs, int start) {
        int n = chs.length;
        int lower = start - 2;

        for (int i = start, j = 0; i < n; i += 2) {
            if (chs[i] < chs[i - 2]) {
                char tmp = chs[i];
                for (j = i; j > lower && chs[j - 2] > tmp; j -= 2) {
                    chs[j] = chs[j - 2];
                }
                chs[j] = tmp;
            }
        }
    }

    private static String transform(char[] chs) {
        for (int i = 0; i < chs.length; i++) {
            char ch = chs[i];
            int num = -1;
            if (ch >= '0' && ch <= '9') {
                num = ch - '0';
            } else if (ch >= 'a' && ch <= 'f') {
                num = ch - 'a' + 10;
            } else if (ch >= 'A' && ch <= 'F') {
                num = ch - 'A' + 10;
            }

            if (num == -1) {
                continue;
            }

            num = ((num & 1) << 3) | ((num & 2) << 1) | ((num & 4) >> 1) | ((num & 8) >> 3);
            chs[i] = (char) (num < 10 ? num + '0' : num - 10 + 'A');
        }

        return new String(chs);
    }
}

编辑于 2024-03-14 22:46:30 回复(0)
import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextLine()) { // 注意 while 处理多个 case
            String inString = in.nextLine();
            String[] split = inString.split(" ");
            String s = split[0] + split[1];
            ArrayList<Character> jiArr = new ArrayList<>();
            ArrayList<Character> ouArr = new ArrayList<>();
            for (int i = 0; i < s.length(); i++) {
                if (i % 2 == 0) {
                    ouArr.add(s.charAt(i));
                } else {
                    jiArr.add(s.charAt(i));
                }
            }

            //排序
            Collections.sort(jiArr, ((o1, o2) -> o1.compareTo(o2)));
            Collections.sort(ouArr, ((o1, o2) -> o1.compareTo(o2)));
            String convert = "";
            for (int i = 0; i < ouArr.size(); i++) {
                convert = convert + ouArr.get(i);
                 if (jiArr.size()-1 >= i ) {
                    convert = convert + jiArr.get(i);
                }
            }

            //初始化16进制字典, 有些字典将所有的数据都初始化了,我觉得是真离谱,当你看完题目能脑测把所有字典初始化?
            Map<Integer, String> map = new HashMap<>();
            map.put(10, "A");
            map.put(11, "B");
            map.put(12, "C");
            map.put(13, "D");
            map.put(14, "E");
            map.put(15, "F");

            Map<String, Integer> map2 = new HashMap<>();
            map2.put("A", 10);
            map2.put("B", 11);
            map2.put("C", 12);
            map2.put("D", 13);
            map2.put("E", 14);
            map2.put("F", 15);

            StringBuffer res = new StringBuffer();
            for (int i = 0; i < convert.length(); i++) {
                char c = convert.charAt(i);
                if (c >= '0' && c <= '9') {
                    String s1 = c + "";
                    int num = Integer.parseInt(s1);
                    Integer anInt = convert(num, map, res);
                    if (anInt == null) continue;

                    res.append(anInt);
                } else if ((c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F')) {
                    String upperCase = (c + "").toUpperCase();
                    Integer integer = map2.get(upperCase);
                    Integer anInt = convert(integer, map, res);
                    if (anInt == null) continue;

                    res.append(anInt);
                } else {
                    res.append(c);
                }

            }
            System.out.println(res);
        }
    }

    private static Integer convert(Integer integer, Map<Integer, String> map, StringBuffer res) {
        int anInt = 0;
        int length = Integer.toBinaryString(integer).length();
        String string = "";
        //二进制字符补位 坑点一
        if (length < 4) {
            int j = 4 - length;
            for (int i1 = 0; i1 < j; i1++) {
                string += "0";
            }
        }
        StringBuffer stringBuffer = new StringBuffer(string + Integer.toBinaryString(integer));
        anInt = Integer.parseInt(stringBuffer.reverse().toString(), 2);
        //转换后的二进制数转换成16进制
        if (anInt > 9) {
            String s2 = map.get(anInt);
            res.append(s2);
            return null;
        }
        return anInt;
    }
}

发表于 2023-12-27 18:24:51 回复(2)
import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String str = in.nextLine().replace(" ", "");
        List<Character> s1 = new ArrayList();
        List<Character> s2 = new ArrayList();
        for(int i = 0; i < str.length(); i++){
            if(i % 2 == 0) s1.add(str.charAt(i));
            else s2.add(str.charAt(i));
        }
        Collections.sort(s1);
        Collections.sort(s2);
        List<Character> list = new ArrayList();
        int i = 0;
        for(int j = 0; i < s1.size() && j < s2.size(); i++,j++){
            list.add(s1.get(i));
            list.add(s2.get(j));
        }
        if(i < s1.size()) list.add(s1.get(s1.size()-1));
        for(i = 0; i < list.size(); i++){
            char c = list.get(i);
            if(!((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F'))){
                System.out.print(c);
                continue;
            } 
            Integer n = Integer.parseInt(c+"", 16);
            String b = Integer.toBinaryString(n);
            StringBuilder sb = new StringBuilder("000".substring(b.length() - 1)+b);
            sb.reverse();
            System.out.print(Integer.toString(Integer.parseInt(sb.toString(), 2), 16).toUpperCase());
        }
        
    }
}

发表于 2023-11-23 02:21:51 回复(0)
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
//嘻嘻
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str1 = sc.next();
        String str2 = sc.next();
        //一:连接
        String str = str1 + str2;
        //二:奇偶排序
        ArrayList<Character> ji = new ArrayList<>();
        ArrayList<Character> ou = new ArrayList<>();
        for (int i = 0; i < str.length(); i++) {
            if ((i + 1) % 2 == 0)
                ou.add(str.charAt(i));
            else
                ji.add(str.charAt(i));
        }
        Collections.sort(ji);
        Collections.sort(ou);
        //第三步:字符转换
        StringBuilder ans = new StringBuilder();
        for (int i = 0; i < str.length(); i++) {
            char c;
            if ((i + 1) % 2 == 0) {
                c = ou.get(0);
                ou.remove(0);
            } else {
                c = ji.get(0);
                ji.remove(0);
            }
            if (!(Character.isDigit(c) || c >= 'A' && c <= 'F' || c >= 'a' && c <= 'f')) {
                ans.append(c);
                continue;
            }
            String s = Integer.toBinaryString(Integer.valueOf(c + "", 16));
            s = new StringBuilder(s).reverse().toString();
            while (s.length() < 4) {
                s += "0";
            }
            s = Integer.toHexString(Integer.valueOf(s, 2));
            ans.append(s.toUpperCase());
        }
        System.out.println(ans.toString());
    }
}
发表于 2023-10-17 21:22:57 回复(0)
import java.util.*;
public class Main {
    public Character TransformChar(Character c) {
        if (!String.valueOf(c).matches("[1-9a-fA-F]")) {
            return c;
        }
        if (c == '0') {
            return '0';
        }
        int sixthNum = Integer.parseInt(String.valueOf(c), 16);
        String binNum = Integer.toBinaryString(sixthNum);
        while (binNum.length() < 4) {
            binNum = "0" + binNum;
        }
        String revStr = new StringBuilder(binNum).reverse().toString();
        int num = Integer.parseInt(revStr.substring(revStr.indexOf("1")), 2);
        String resutNum = Integer.toHexString(num);
        return resutNum.matches("[a-f]") ? resutNum.toUpperCase().charAt( 0) : resutNum.charAt(0);
    }

    public String transformStr(String str) {
        String replace = str.replace(" ", "");
        char[] chars = replace.toCharArray();
        ArrayList<Character> singleArr = new ArrayList<>();
        ArrayList<Character> doubleArr = new ArrayList<>();

        for (int i = 0; i < chars.length; i++) {
            if (i % 2 != 0) {
                singleArr.add(chars[i]);
            } else {
                doubleArr.add(chars[i]);
            }
        }

        Collections.sort(singleArr);
        Collections.sort(doubleArr);

        Iterator<Character> iterator1 = singleArr.iterator();
        Iterator<Character> iterator2 = doubleArr.iterator();

        for (int i = 0; i < singleArr.size(); i++) {
            Character next = iterator1.next();
            Character ch = new Main().TransformChar(next);
            singleArr.set(i, ch);
        }

        for (int i = 0; i < doubleArr.size(); i++) {
            Character next = iterator2.next();
            Character ch = new Main().TransformChar(next);
            doubleArr.set(i, ch);
        }

        Iterator<Character> newIterator1 = singleArr.iterator();
        Iterator<Character> newIterator2 = doubleArr.iterator();
        for (int i = 0; i < chars.length; i++) {
            if (i % 2 != 0) {
                chars[i] = newIterator1.next();
            } else {
                chars[i] = newIterator2.next();
            }
        }
        return new String(chars);
    }
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String str = in.nextLine();
        System.out.print(new Main().transformStr(str));
    }
}

发表于 2023-09-19 01:27:59 回复(0)
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String arr[]=in.nextLine().split(" ");
        String s=arr[0]+arr[1];
        String []str=new String[s.length()];
        for(int i = 0;i<s.length();i++){
            str[i] = String.valueOf(s.charAt(i));
        }

        for(int i=0;i<str.length-2;i+=2){
            for(int j=i+2;j<str.length;j+=2){
                if(str[i].charAt(0)>str[j].charAt(0)) {
                    String temp = str[i];
                    str[i] = str[j];
                    str[j] = temp;
                }
            }
        }
        for(int i=1;i<str.length-2;i+=2){
            for(int j=i+2;j<str.length;j+=2){
                if(str[i].charAt(0)>str[j].charAt(0)) {
                    String temp = str[i];
                    str[i] = str[j];
                    str[j] = temp;
                }
            }
        }

        for(int i = 0;i<str.length;i++){
            if(str[i].charAt(0)=='1'){
                System.out.print("8");
            }else if(str[i].charAt(0)=='2') {
                System.out.print("4");
            }else if(str[i].charAt(0)=='3') {
                System.out.print("C");
            }else if(str[i].charAt(0)=='4') {
                System.out.print("2");
            }else if(str[i].charAt(0)=='5') {
                System.out.print("A");
            }else if(str[i].charAt(0)=='6') {
                System.out.print("6");
            }else if(str[i].charAt(0)=='7') {
                System.out.print("E");
            }else if(str[i].charAt(0)=='8') {
                System.out.print("1");
            }else if(str[i].charAt(0)=='A'||str[i].charAt(0)=='a') {
                System.out.print("5");
            }else if(str[i].charAt(0)=='B'||str[i].charAt(0)=='b') {
                System.out.print("D");
            }else if(str[i].charAt(0)=='C'||str[i].charAt(0)=='c') {
                System.out.print("3");
            }else if(str[i].charAt(0)=='D'||str[i].charAt(0)=='d') {
                System.out.print("B");
            }else if(str[i].charAt(0)=='E'||str[i].charAt(0)=='e') {
                System.out.print("7");
            }else if(str[i].charAt(0)=='F'||str[i].charAt(0)=='f') {
                System.out.print("F");
            }else {
                System.out.print(str[i]);
            }
        }
    }
}

发表于 2023-09-17 15:04:29 回复(0)
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String str1 = scanner.next();
        String str2 = scanner.next();
        String s = str1 + str2;
        char[] chars = s.toCharArray();
        for (int i = 0; i < chars.length; i = i + 2) {
            for (int j = 0; j < chars.length; j = j + 2) {
                if (chars[i] < chars[j]) {
                    swap(chars, i, j);
                }
            }
        }
        for (int i = 1; i < chars.length; i = i + 2) {
            for (int j = 1; j < chars.length; j = j + 2) {
                if (chars[i] < chars[j]) {
                    swap(chars, i, j);
                }
            }
        }
//        for (char ch :
//                chars) {
//            System.out.print(ch);
//        }
        String result = hexConversion(String.copyValueOf(chars));
        System.out.println(result);
    }
    public static void swap(char[] chars, int i, int j) {
        Character temp = chars[i];
        chars[i] = chars[j];
        chars[j] = temp;
    }
    public static String hexConversion(String input) {
        StringBuilder result = new StringBuilder();

        for (int i = 0; i < input.length(); i++) {
            char c = input.charAt(i);

            if (Character.isDigit(c) || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f')) {
                int decimal = Character.digit(c, 16);
                String binary = String.format("%4s", Integer.toBinaryString(decimal)).replace(' ', '0');
                String reversedBinary = new StringBuilder(binary).reverse().toString();
                int reversedDecimal = Integer.parseInt(reversedBinary, 2);
                char hexChar = Character.toUpperCase(Integer.toHexString(
                        reversedDecimal).charAt(0));
                result.append(hexChar);
            } else {
                result.append(c);
            }
        }

        return result.toString();
    }
}
发表于 2023-08-11 21:26:47 回复(0)
import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextLine()) { // 注意 while 处理多个 case
            String a = in.nextLine().replaceAll(" ", "");

            // System.out.println(getMix(a));
            // System.out.println((int)'0');
            String str = getMix(a);
            // System.out.println(str);
            char[] charArr = str.toCharArray();
            int n = charArr.length;
            for (int i = 0; i < n; i++) {
                charArr[i] = changeChar(charArr[i]);
            }
            String str2 = new String(charArr);
            System.out.println(str2);
        }
    }

    public static char changeChar(char input) {
        String tempStr = null;
        if (input >= '0' && input <= '9') {
            tempStr = Integer.toBinaryString(input - '0');
        } else if (input >= 'A' && input <= 'F') {
            tempStr = Integer.toBinaryString(input - '7');
        } else if (input >= 'a' && input <= 'f') {
            tempStr = Integer.toBinaryString(input - 'W');
        } else {
            return input;
        }
        // System.out.println(tempStr);
        while (tempStr.length() < 4) {
            tempStr = "0" + tempStr;
        }
        char[] tempCharArr = tempStr.toCharArray();
        //反向遍历
        int sum = 0;
        for (int i = 3; i > -1; i--) {
            sum += (tempCharArr[i] - '0') * Math.pow(2, i);
        }

        if (sum >= 0 && sum <= 9) {
            return (char)(sum + 48);
        } else {
            return (char)(sum + 55);
        }
    }

    public static String getMix(String input1) {
        char[] input2 = input1.toCharArray();
        char[] ouShu = new char[input2.length / 2 + input2.length % 2];
        char[] jiShu = new char[input2.length / 2];

        for (int i = 0; i < input2.length; i++) {
            if (i % 2 == 0) {
                ouShu[i / 2] = input2[i];
            } else {
                jiShu[(i - 1) / 2] = input2[i];
            }
        }

        Arrays.sort(ouShu);
        Arrays.sort(jiShu);

        for (int i = 0; i < input2.length; i++) {
            if (i % 2 == 0) {
                input2[i]   = ouShu[i / 2];
            } else {
                input2[i] = jiShu[(i - 1) / 2];
            }
        }

        return (new String(input2));
    }
}

发表于 2023-07-05 21:40:00 回复(0)
看题目的时候就无语了,这么多的步骤,还有转换。。后来看了下题解,看到了转换表,才有了新的思路
import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 记录对照表,十六进制数量有限,用对照表的方式比用代码更方便,注意key值可能有大小写,value值都是大写
        Map<Character, Character> tr = new HashMap<Character, Character>();
        tr.put('0', '0');
        tr.put('1', '8');
        tr.put('2', '4');
        tr.put('3', 'C');
        tr.put('4', '2');
        tr.put('5', 'A');
        tr.put('6', '6');
        tr.put('7', 'E');
        tr.put('8', '1');
        tr.put('9', '9');
        tr.put('a', '5');
        tr.put('b', 'D');
        tr.put('c', '3');
        tr.put('d', 'B');
        tr.put('e', '7');
        tr.put('f', 'F');
        tr.put('A', '5');
        tr.put('B', 'D');
        tr.put('C', '3');
        tr.put('D', 'B');
        tr.put('E', '7');
        tr.put('F', 'F');

        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNext()) { // 注意 while 处理多个 case
            String a = in.nextLine();
            int i = 0, length = a.length();
            List<Character> a1 = new ArrayList<>();
            List<Character> a2 = new ArrayList<>();

            // 记录奇数、偶数位置的字符串
            for (char c : a.toCharArray()) {
                // 就一个空格,记录时顺手去掉
                if (c == ' ') {
                    continue;
                }
                if (i % 2 == 0) {
                    a1.add(c);
                } else {
                    a2.add(c);
                }
                i++;
            }

            // 分别排序
            a1.sort(new Comparator<Character>() {
                public int compare(Character c1, Character c2) {
                    return c1 - c2;
                }
            });
            a2.sort(new Comparator<Character>() {
                public int compare(Character c1, Character c2) {
                    return c1 - c2;
                }
            });
            
            // 按照十六进制替换表替换
            StringBuilder sb = new StringBuilder();
            length = a1.size() + a2.size();
            for (i = 0; i < length ; i++) {
                char c;
                if (i % 2 == 0) {
                    c = a1.get(i / 2);
                } else {
                    c = a2.get(i / 2);
                }
                if (('0' <= c && c <= '9') || ('a' <= c && c <= 'f') || ('A' <= c && c <= 'F')) {
                    c = tr.get(c);
                }
                sb.append(c);
            }
            System.out.println(sb.toString());
        }
    }
}


发表于 2023-05-23 14:57:59 回复(0)
华为OD深圳/西安岗位,部门急招,薪资20-80w. 部门有专门机考辅导人员,每周开视频讲座。欢迎叨扰:***********
编辑于 2023-05-10 15:58:55 回复(1)
import java.util.*;

public class Main {
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        String str1 = in.next();
        String str2 = in.next();
        String str = str1 + str2;
        int jiNum,ouNum;
        int mod = str.length() % 2;
        if(0 == mod){
            jiNum = ouNum = str.length() / 2;
        }else{
            ouNum = str.length() / 2;
            jiNum = ouNum + 1;
        }
        char[] ji = new char[jiNum];
        char[] ou = new char[ouNum];
        char[] strChar = str.toCharArray();
        for (int i = 0; i < strChar.length; i++) {
            if(0 == (i + 1) % 2){
                ou[i / 2] = strChar[i];
            }else{
                ji[i / 2] = strChar[i];
            }
        }
        Arrays.sort(ji);
        Arrays.sort(ou);
        String strNew = "";
        for (int i = 0; i < strChar.length; i++) {
            if(0 == (i + 1) % 2){
                strNew += ou[i / 2];
            }else{
                strNew += ji[i / 2];
            }
        }
        String print = "";
        for (int i = 0; i < strNew.length(); i++) {
            char c = strNew.charAt(i);
            if(needChange(c)){
                int m = Integer.parseInt(String.valueOf(c), 16);
                String num = Integer.toString(m, 2);
                while (num.length() < 4){
                    num = "0" + num;
                }
                StringBuilder second = new StringBuilder(num);
                second.reverse();
                String num16 = Integer.toString(Integer.parseInt(second.toString(), 2), 16);
                print += num16.toUpperCase();
            }else{
                print += c;
            }
        }
        System.out.println(print);
    }

    private static boolean needChange(char c){
        if(c >= '0' && c <= '9'){
            return true;
        } else if(c >= 'A' && c <= 'F'){
            return true;
        } else if(c >= 'a' && c <= 'f'){
            return true;
        }
        return false;
    }
}
发表于 2023-04-26 18:13:29 回复(0)