一、题目描述
对报文进行重传和重排序是常用的可靠性机制,重传缓冲区内有一定数量的子报文,每个子报文在原始报文中的顺序已知,现在需要恢复出原始报文。
二、输入描述
输入第一行为N,表示子报文的个数,0 < N <= 1000。
输入第二行为N个子报文,以空格分开,子报文格式为字符串报文内容+后缀顺序索引,字符串报文内容由[a-z,A-Z]组成,后缀为整形值,表示顺序。顺序值唯一,不重复。
三、输出描述
输出恢复出的原始报文。
按照每个子报文的顺序的升序排序恢复出原始报文,顺序后缀需要从恢复出的报文中删除掉。
四、解题思路
题目要求根据子报文的顺序索引恢复出原始报文。子报文由报文内容和顺序索引组成,报文内容是字符串,顺序索引是整数。
解题思路如下:
- 读取输入的子报文个数N;
- 读取输入的N个子报文,并解析每个子报文的报文内容和顺序索引;
- 使用一个哈希表letterMap存储顺序索引和报文内容的对应关系;
- 遍历顺序索引从1到N,按照顺序从letterMap中取出对应的报文内容,并拼接到结果字符串res中;
- 输出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机考。专栏会持续更新,每天在线答疑。