华为OD机试真题B卷 Java 实现【报文重排序】,附详细解题思路-LMLPHP

一、题目描述

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

二、输入描述

输入第一行为N,表示子报文的个数,0 < N <= 1000。

输入第二行为N个子报文,以空格分开,子报文格式为字符串报文内容+后缀顺序索引,字符串报文内容由[a-z,A-Z]组成,后缀为整形值,表示顺序。顺序值唯一,不重复。

三、输出描述

输出恢复出的原始报文。

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

四、解题思路

题目要求根据子报文的顺序索引恢复出原始报文。子报文由报文内容和顺序索引组成,报文内容是字符串,顺序索引是整数。

解题思路如下:

  1. 读取输入的子报文个数N;
  2. 读取输入的N个子报文,并解析每个子报文的报文内容和顺序索引;
  3. 使用一个哈希表letterMap存储顺序索引和报文内容的对应关系;
  4. 遍历顺序索引从1到N,按照顺序从letterMap中取出对应的报文内容,并拼接到结果字符串res中;
  5. 输出res作为恢复出的原始报文。

解题思路分析:

该算法首先将输入的子报文解析并存储到哈希表中,哈希表的键为顺序索引,值为报文内容。然后按照顺序从1到N依次从哈希表中取出报文内容,将其拼接到结果字符串中。最终输出结果字符串作为恢复出的原始报文。算法的时间复杂度为O(N),其中N为子报文的个数。

五、Java算法源码

import java.util.*;

public class Main{
 
    public static void main(String[] args) {
 
        Scanner sc = new Scanner(System.in);
 
        int N = sc.nextInt();
        sc.nextLine();
        String[] strings = sc.nextLine().split(" ");
 
        Map<Integer, String> letterMap = new HashMap<>();
        for(int i=0; i<strings.length; i++){
            String str = strings[i];
            //防止空格
            if(str.equals("")){
                continue;
            }
            //数字开始的下标
            int index = 0;
            for(int j=0; j<str.length(); j++){
                if(Character.isDigit(str.charAt(j))){
                    index = j;
                    break;
                }
            }
            //字母部分
            String letter = str.substring(0, index);
            //顺序部分
            int num = Integer.parseInt(str.substring(index));
            letterMap.put(num, letter);
        }
 
        String res = "";
        for(int i=1; i<=N; i++){
            res += letterMap.get(i) + " ";
        }
 
        System.out.println(res.substring(0, res.length() - 1));
    }
}

🏆本文收录于,华为OD机试(JAVA)(2022&2023)

本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。

华为OD机试真题B卷 Java 实现【报文重排序】,附详细解题思路-LMLPHP

05-30 00:39