一、题目描述
对报文进行重传和重排序是常用的可靠性机制,重传缓冲区内有一定数量的子报文,每个子报文在原始报文中的顺序已知,现在需要恢复出原始报文。
二、输入描述
输入第一行为N,表示子报文的个数,0 < N <= 1000。
输入第二行为N个子报文,以空格分开,子报文格式为字符串报文内容+后缀顺序索引,字符串报文内容由[a-z,A-Z]组成,后缀为整形值,表示顺序。顺序值唯一,不重复。
三、输出描述
输出恢复出的原始报文。
按照每个子报文的顺序的升序排序恢复出原始报文,顺序后缀需要从恢复出的报文中删除掉。
四、解题思路
题目要求根据子报文的顺序索引恢复出原始报文。子报文由报文内容和顺序索引组成,报文内容是字符串,顺序索引是整数。
解题思路如下:
- 读取输入的子报文个数N;
- 读取输入的N个子报文,并解析每个子报文的报文内容和顺序索引;
- 使用一个哈希表letterMap存储顺序索引和报文内容的对应关系;
- 遍历顺序索引从1到N,按照顺序从letterMap中取出对应的报文内容,并拼接到结果字符串res中;
- 输出res作为恢复出的原始报文。
解题思路分析:
该算法首先将输入的子报文解析并存储到哈希表中,哈希表的键为顺序索引,值为报文内容。然后按照顺序从1到N依次从哈希表中取出报文内容,将其拼接到结果字符串中。最终输出结果字符串作为恢复出的原始报文。算法的时间复杂度为O(N),其中N为子报文的个数。
五、JavaScript算法源码
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));
}
}
六、效果展示
1、输入
6
nezha1,study2,java3,is4,very5,good6
2、输出
nezhastudyjavaisverygood
3、说明
🏆下一篇:华为OD机试真题 JavaScript 实现【相对开音节】【2022Q4 100分】,附详细解题思路
🏆本文收录于,华为OD机试(JavaScript)真题(A卷+B卷)
每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,可加入华为OD刷题群(私信即可),发现新题目,随时更新,全天CSDN在线答疑。