【华为OD机试】真题B卷-报文重排序(JAVA)

华为OD机试真题汇总目录

    【华为OD机试】真题汇总A+B+C+D券(Python实现)

    【华为OD机试】真题汇总A+B+C+D卷(JAVA实现)

    【华为OD机试】真题汇总A+B+C+D卷(C++实现)

一、题目

题目描述:报文重排序

对报文进行重传和重排序是常用的可靠性机制,重传缓冲区内有一定数量的子报文,每个子报文在原始报文中的顺序已知,现在需要恢复出原始报文。

二、输入输出

输入描述:
输入第一行为N,表示子报文的个数,0 < N <= 1000。 输入第二行为N个子报文,以空格分开,子报文格式为
字符串报文内容+后缀顺序索引,
字符串报文内容由|a-z,A-Z)组成后缀为整形值,表示顺序。
顺序值唯一,不重复。
输出描述:

EN输出恢复出的原始报文。按照每个子报文的顺序的升席排序恢复出原始报文,顺序后缀需要从恢复出的报文中删除掉

三、示例

用例1:
输入:
4
rolling3 stone4 like1 a2
输出:
like a rolling stone
说明: 4个子报文的内容分别为roling,stone,like,a,顺序值分别为3,4,1,2,按照顺序值升序并删除掉顺序后缀得到恢复的原始报文: like a rolling stone
用例2:
输入:
8
Lgifts6 and7  Exchanging1 all2 precious5 things8 kinds3 of4
// 注: 这里需要注意:and7与Exchanging1有两个空格
输出:
Exchanging all kinds of precious gifts and things

四、解题思路

  1. 使用 Scanner 从标准输入读取整数 n 和一行字符串数组。
  2. 定义 getResult 方法来处理输入的字符串数组,并返回排序后的结果字符串。
  3. 使用正则表达式 Pattern 来匹配字符串中的字母部分和数字部分。
  4. 遍历输入的字符串数组,提取字母部分和数字部分,将结果存储在一个列表中。
  5. 对列表中的元素按照数字部分进行排序。
  6. 将排序后的字母部分拼接为一个字符串,每个单词之间用空格分隔。
  7. 去除最后一个多余的空格。
  8. 输出最终拼接好的字符串。

五、参考代码

/*
 * @Author: mgc
 * @Date: 2024-02-02 17:47:00
 * @LastEditors: Do not edit
 * @LastEditTime: 2024-02-02 17:48:55
 */

// import java.util.*;
// import java.util.HashMap;
// import java.util.Scanner;
// import java.util.regex.Matcher;
// import java.util.stream.Stream;
// import java.util.regex.Pattern;
// import java.util.stream.Collectors;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        int n = Integer.parseInt(scanner.nextLine());
        String[] arr = scanner.nextLine().split(" ");

        System.out.println(getResult(arr));
    }

    public static String getResult(String[] arr) {
        List<String[]> ans = new ArrayList<>();

        Pattern pattern = Pattern.compile("([a-zA-Z]+)(\\d+)");

        for (String s : arr) {
            Matcher matcher = pattern.matcher(s);

            if (matcher.find()) {
                String content = matcher.group(1);
                int i = Integer.parseInt(matcher.group(2)) - 1;

                ans.add(new String[] {String.valueOf(i), content});
            }
        }

        ans.sort((a, b) -> Integer.parseInt(a[0]) - Integer.parseInt(b[0]));

        StringBuilder result = new StringBuilder();
        for (String[] pair : ans) {
            result.append(pair[1]).append(" ");
        }

        // 去除最后一个多余的空格
        if (result.length() > 0) {
            result.deleteCharAt(result.length() - 1);
        }

        return result.toString();
    }
}