首页 > 试题广场 >

字符串合并处理

[编程题]字符串合并处理
  • 热度指数:192864 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

按照指定规则对输入的字符串进行处理。

详细描述:

第一步:将输入的两个字符串str1和str2进行前后合并。如给定字符串 "dec" 和字符串 "fab" , 合并后生成的字符串为 "decfab"

第二步:对合并后的字符串进行排序,要求为:下标为奇数的字符和下标为偶数的字符分别从小到大排序。这里的下标的意思是字符在字符串中的位置。注意排序后在新串中仍需要保持原来的奇偶性。例如刚刚得到的字符串“decfab”,分别对下标为偶数的字符'd'、'c'、'a'和下标为奇数的字符'e'、'f'、'b'进行排序(生成 'a'、'c'、'd' 和 'b' 、'e' 、'f'),再依次分别放回原串中的偶数位和奇数位,新字符串变为“abcedf”

第三步:对排序后的字符串中的'0'~'9'、'A'~'F'和'a'~'f'字符,需要进行转换操作。
转换规则如下:
对以上需要进行转换的字符所代表的十六进制用二进制表示并倒序,然后再转换成对应的十六进制大写字符(注:字符 a~f 的十六进制对应十进制的10~15,大写同理)。
如字符 '4',其二进制为 0100 ,则翻转后为 0010 ,也就是 2 。转换后的字符为 '2'。
如字符 ‘7’,其二进制为 0111 ,则翻转后为 1110 ,对应的十进制是14,转换为十六进制的大写字母为 'E'。
如字符 'C',代表的十进制是 12 ,其二进制为 1100 ,则翻转后为 0011,也就是3。转换后的字符是 '3'。

根据这个转换规则,由第二步生成的字符串 “abcedf” 转换后会生成字符串 "5D37BF"。


数据范围:输入的字符串长度满足



输入描述:

样例输入两个字符串,用空格隔开。



输出描述:

输出转化后的结果。

示例1

输入

dec fab

输出

5D37BF
示例2

输入

ab CD

输出

3B5D

说明

合并后为abCD,按奇数位和偶数位排序后是CDab(请注意要按ascii码进行排序,所以C在a前面,D在b前面),转换后为3B5D          
示例3

输入

123 15

输出

88C4A
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 回复(0)
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)
一步一步来呗
import java.util.*;
import java.util.Comparator;
// 注意类名必须为 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 one=a+b;          //第一步
            char[] two=one.toCharArray();
            ArrayList<Character> first=new ArrayList<>();   //奇字符串
            ArrayList<Character> second=new ArrayList<>();   //偶字符串
            for(int i=0;i<two.length;i++) //第二步
            {
                if((i%2)==0)
                {
                   second.add(two[i]);
                }
                else
                {
                   first.add(two[i]);
                }                                  
            }
         first.sort(Comparator.naturalOrder());    //奇字符串排序
         second.sort(Comparator.naturalOrder());  //偶字符串排序
           //第三步转换操作
        for(int i=0;i<first.size()+second.size();i++) //排序后重组
        {
            if(i%2==0)
            {
                two[i]=second.get(i/2);
            }
            else
            {
                two[i]=first.get(i/2);
            }
        }
        String result="";               //结果
          for(char p:two)
          {
            if((p>=48&&p<=57)||(p>=65&&p<70)||(p>=97&&p<=102))   //处理数字A-Fa-f字符
            {
                int n=0;
                if(p>=48&&p<=57)
                {
                    n=Integer.parseInt(p+"");
                }
                else
                {
                    switch(p)
                    {
                        case 'A':
                        case 'a':
                        n=10;
                        break;
                        case 'B':
                        case 'b':
                        n=11;
                        break;
                        case 'C':
                        case 'c':
                        n=12;
                        break;
                        case 'D':
                        case 'd':
                        n=13;
                        break;
                        case 'E':
                        case 'e':
                        n=14;
                        break;
                        case 'F':
                        case 'f':
                        n=15;
                        break;
                        default:
                        break;
                    }
                }
             String c="";      //输出二进制翻转后的结果
             while(n!=0)        
             {
                int w=n%2;
                c=c+w;
                n=n/2;
             }
             int x=4-c.length();   //这个地方注意
             if(c.length()<4)
             {
                for(int i=0;i<x;i++)
                {
                    c=c+"0";
                }
             }
             int m=0;
             for(int i=c.length()-1;i>=0;i--)    //得到转换后的数字
             {
                int g=Integer.parseInt(c.charAt(i)+"");
                  m=m+(int)Math.pow(2,c.length()-i-1)*g;
             }
             String end="";
            if(!(m>=0&&m<=9))               //转化16进制
            {
                    switch(m)
                    {
                        case 10:
                        end=end+"A";
                        break;
                        case 11:
                        end=end+"B";
                        break;
                        case 12:
                        end=end+"C";
                        break;
                        case 13:
                        end=end+"D";
                        break;
                        case 14:
                        end=end+"E";
                        break;
                        case 15:
                        end=end+"F";
                        break;
                        default:
                        break;
                    }
            }
            else
            {
                    end=m+"";
            }
            result=result+end;
            }
             else
             {
                result=result+p;
             }
          }
          System.out.println(result);
        }
    }
}
发表于 2023-04-23 17:20:58 回复(0)
 Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextLine()) { // 注意 while 处理多个 case
            String str = in.nextLine();
            String[] strs = str.split(" ");
            String c = strs[0] + strs[1];
            char[] chars = c.toCharArray();
            int num = chars.length;
            Character[] chars1 = null;
            Character[] chars2  = null;
            if (num % 2 == 0) { //偶数个
                chars1  = new Character[num / 2];
                chars2  = new Character[num / 2];
            } else { //奇数个
                chars1  = new Character[num / 2];
                chars2  = new Character[num / 2 + 1];//注意当奇数个时,偶数下标的多一个
            }
            for (int i = 0; i < num; i++) {
                if (i % 2 == 0) { //下标偶数
                    chars2[i / 2] = chars[i];
                } else {
                    chars1[(i - 1) / 2] = chars[i];
                }
            }
            for (int i = 0; i < chars2.length - 1; i++) {
                for (int j = 0; j < chars2.length - 1 - i; j++) {
                    if (chars2[j] > chars2[j + 1]) {
                        Character temp = chars2[j];
                        chars2[j] = chars2[j + 1];
                        chars2[j + 1] = temp;
                    }
                }
            }
            for (int i = 0; i < chars1.length - 1; i++) {
                for (int j = 0; j < chars1.length - 1 - i; j++) {
                    if (chars1[j] > chars1[j + 1]) {
                        Character temp = chars1[j];
                        chars1[j] = chars1[j + 1];
                        chars1[j + 1] = temp;
                    }
                }
            }
            Character[] charsNew  = new Character[num];
            for (int i = 0; i < num; i++) {
                if (i % 2 == 0) { //下标偶数
                    charsNew[i] = chars2[i / 2];
                } else { //奇数
                    charsNew[i] = chars1[(i - 1) / 2];
                }
            }
            for (int i = 0; i < num; i++) {
                Character cc =  charsNew[i];
                if (cc >= 48 && cc <= 57) { //0-9
                    if (cc == 48) { //0-0000-0000
                        charsNew[i] = '0';
                    } else if (cc == 49) {//1-0001-1000-8
                        charsNew[i] = '8';
                    } else if (cc == 50) {//2-0010-0100-4
                        charsNew[i] = '4';
                    } else if (cc == 51) {//3-0011-1100-12-C
                        charsNew[i] = 'C';
                    } else if (cc == 52) {//4-0100-0010-2
                        charsNew[i] = '2';
                    } else if (cc == 53) {//5-0101-1010-10-A
                        charsNew[i] = 'A';
                    } else if (cc == 54) {//6-0110-0110-6
                        charsNew[i] = '6';
                    } else if (cc == 55) {//7-0111-1110-14-E
                        charsNew[i] = 'E';
                    } else if (cc == 56) {//8-1000-0001-1
                        charsNew[i] = '1';
                    } else if (cc == 57) {//9-1001-1001-9
                        charsNew[i] = '9';
                    }
                } else if (cc >= 65 && cc <= 90 || cc >= 97 && cc <= 122) { //a-f,A-F
                    if (cc == 65 || cc == 97) { //a || A -10-1010-0101-5
                        charsNew[i] = '5';
                    } else if (cc == 66 || cc == 98) { //b || B -11-1011-1101-13-D
                        charsNew[i] = 'D';
                    } else if (cc == 67 || cc == 99) { //c || C -12-1100-0011-3
                        charsNew[i] = '3';
                    } else if (cc == 68 || cc == 100) { //d || D -13-1101-1011-11-B
                        charsNew[i] = 'B';
                    } else if (cc == 69 || cc == 101) { //e || E -14-1110-0111-7
                        charsNew[i] = '7';
                    } else if (cc == 70 || cc == 102) { //f || F -15-1111-1111-F
                        charsNew[i] = 'F';
                    }
                } else {

                }
            }
            StringBuffer bf = new StringBuffer();
            for (int i = 0; i < num; i++) {
                bf.append(charsNew[i]);
            }
            System.out.println(bf.toString());
        }
发表于 2023-04-12 00:55:11 回复(0)
import java.util.Scanner;
import java.util.PriorityQueue;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        PriorityQueue<Character> oddPq = new PriorityQueue<>();
        PriorityQueue<Character> evenPq = new PriorityQueue<>();
        int index = 0;
        for (int i = 0; i < str.length(); i++) {
            // 判断当前索引是偶数位还是奇数位
            // 遇到空格后需要修正index的值
            if (str.charAt(i) == ' ') {
                index++;
                continue;
            }
            if ((i-index) % 2 == 0) {
                evenPq.add(str.charAt(i));
            } else {
                oddPq.add(str.charAt(i));
            }
        }
        char[] charr = new char[str.length() - 1];
        index = 0;
        while (!oddPq.isEmpty() && !evenPq.isEmpty()) {
            charr[index++] = evenPq.poll();
            charr[index++] = oddPq.poll();
        }
        // 如果总数为奇数,则evenPq中还剩有一个元素
        if (!evenPq.isEmpty()) charr[charr.length - 1] = evenPq.poll();
        System.out.println(code(charr));
    }
    public static String code (char[] charr) {
        for (int i = 0; i < charr.length; i++) {
            char c = charr[i];
            if (c >= '0' && c <= '9') {
                c = reverseBinaryOfNumber(c - '0');
            } else if ((c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f')) {
                c = c >= 'a' ? reverseBinaryOfNumber(10 + c - 'a') : reverseBinaryOfNumber(10 + c - 'A');
            }
            charr[i] = c;
        }
        return new String(charr);
    }

    public static char reverseBinaryOfNumber(int x) {
        int temp = 0;
        int power = 8;
        while (x != 0) {
            if ((x & 1) == 1) {
                temp += power;
            }
            x >>= 1;
            power /= 2; 
        }
        char c = '0';
        if (temp > 9) {
            c = 'A';
            c += temp - 10;
        }else {
            c += temp;
        }
        return c;
    }
}

发表于 2023-04-04 14:47:19 回复(0)
这道题最坑的就是,没有标出不在0~f之间的字符如何处理,拿用例推出来,不在此区间的字符不做转换处理
发表于 2023-03-29 16:49:20 回复(0)
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * 自己敲的,搞出来看来下别人的,感觉我的就是直来直往,没有取巧,可能更易于理解,还有字母排序我写的绕了,应该用Arrays或者Collections下排序。不改了吧。
 */
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNext()) {
            String a = in.next();
            String b = in.next();
            String temp = a + b;
            temp = sortChar(temp);
            temp = convert(temp);
            System.out.println(temp);
        }
    }

    /*
     * 按照字母表顺序奇偶位排序
     */
    private static String sortChar(String str) {
        List odds = new ArrayList();
        List evens = new ArrayList();
        for (int i = 0; i < str.length(); i++) {
            if (i % 2 == 0) {
                odds.add(str.charAt(i));
            } else {
                evens.add(str.charAt(i));
            }
        }
        Object[] oddChar = odds.stream().sorted().toArray();
        Object[] evenChar = evens.stream().sorted().toArray();
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < str.length(); i++) {
            if (i % 2 == 0) {
                sb.append(oddChar[i / 2]);
            } else {
                sb.append(evenChar[i / 2]);
            }
        }
        return sb.toString();
    }

    /*
     * 字符串转换
     */
    private static String convert(String str) {
        StringBuffer result = new StringBuffer();
        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
            if (Character.isDigit(c)) {
                binaryConvert(result, c);
            } else if (Character.isLetter(c) && Character.toLowerCase(c) <= 'f') {
                int digitC = findDigit(c);
                binaryConvert(result, digitC);
            } else {
                result.append(c);
            }
        }
        return result.toString();
    }

    /*
     * 二进制取反并按照要求转换
     */
    private static void binaryConvert(StringBuffer result, int digitC) {
        String temp = Integer.toBinaryString(digitC);
        StringBuffer binary = new StringBuffer(temp.substring(temp.length() - 4));
        binary = binary.reverse();
        int resultDig = Integer.valueOf(binary.toString(), 2);
        if (resultDig >= 10) {
            result.append(finddLetter(resultDig));
        } else {
            result.append(resultDig);
        }
    }

    /*
     * 字母数字码表对应
     */
    private static int findDigit(char c) {
        switch (Character.toLowerCase(c)) {
            case 'a':
                return 10;
            case 'b':
                return 11;
            case 'c':
                return 12;
            case 'd':
                return 13;
            case 'e':
                return 14;
            case 'f':
                return 15;
            default:
                return -1;
        }
    }

    /*
     * 数字字母码表对应
     */
    private static String finddLetter(int dg) {
        switch (dg) {
            case 10:
                return "A";
            case 11:
                return "B";
            case 12:
                return "C";
            case 13:
                return "D";
            case 14:
                return "E";
            case 15:
                return "F";
            default:
                return null;
        }
    }
}
发表于 2023-03-16 21:57:57 回复(0)
import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String str1 = in.next();
        String str2 = in.next();

        String s3 = str1 + str2;
        List<Character> even = new ArrayList<>(s3.length() / 2 + 1);
        List<Character> odd = new ArrayList<>(s3.length() / 2 + 1);
        for (int i = 0; i < s3.length(); i++) {
            char c = s3.charAt(i);
            if (i % 2 == 0) {
                even.add(c);
            } else {
                odd.add(c);
            }
        }
        Comparator<Character> cmp = (o1, o2) -> {
            return Character.compare(o1, o2);
        };
        even.sort(cmp);
        odd.sort(cmp);
        char[] chars = new char[s3.length()];
        for (int i = 0; i < even.size(); i++) {
            chars[2 * i] = even.get(i);
        }
        for (int i = 0; i < odd.size(); i++) {
            chars[2 * i + 1] = odd.get(i);
        }

        Map<Character, Integer> letterToNum = charToNum();
        Map<Integer, Character> numToChar = numToChar();
        StringBuilder sb = new StringBuilder();
        for (char c : chars) {
            if (letterToNum.containsKey(c)) {
                int number = letterToNum.get(c);
                int n2 = reverseBinary(number);
                sb.append(numToChar.get(n2));
            } else {
                sb.append(c);
            }
        }
        System.out.println(sb.toString());
    }

    private static Map<Character,Integer> charToNum() {
        Map<Character,Integer> map = new HashMap<>();
        for (int i = 0; i < 10; i++) {
            char c = (char) ('0' + i);
            map.put(c, i);
        }
        for (char c = 'A'; c <= 'F'; c++) {
            int num = c - 'A' + 10;
            map.put(c, num);
        }
        for (char c = 'a'; c <= 'f'; c++) {
            int num = c - 'a' + 10;
            map.put(c, num);
        }
        return map;
    }

    private static Map<Integer, Character> numToChar() {
        Map<Integer, Character> map = new HashMap<>();
        for (int i = 0; i < 10; i++) {
            char c = (char) ('0' + i);
            map.put(i, c);
        }
        for (char c = 'A'; c <= 'F'; c++) {
            int num = c - 'A' + 10;
            map.put(num, c);
        }
        return map;
    }

    private static int reverseBinary(int number) {
        int x1 = number & 1;
        int x2 = (number >> 1) & 1;
        int x3 = (number >> 2) & 1;
        int x4 = (number >> 3) & 1;
        return (x1 << 3) + (x2 << 2) + (x3 << 1) + x4;
    }
}

发表于 2023-03-02 10:28:54 回复(0)