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

华为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. 从标准输入获取整数 n 和一个包含字符串的数组。
  2. process_input 函数处理输入数组,使用正则表达式匹配字符串中的字母和数字部分,并按数字部分排序。
  3. 创建一个空列表 result 来存储匹配结果。
  4. 遍历输入数组,对每个字符串进行匹配,提取内容和索引,将它们作为列表 [index, content] 添加到 result 中。
  5. 对 result 列表按照索引排序。
  6. 使用 map 函数提取排序后的内容,并用空格连接起来。
  7. 最后打印输出处理后的结果。

五、参考代码 

# -*- coding: utf-8 -*-
'''
@Time    :   2023/12/10 00:09:00
@Author  :   mgc 
@Version :   1.0
@Desc    :   None
'''

# import os
# import re
# import sys
# import copy
# import math
# import queue
# import functools
# from queue import Queue
# from collections import Counter, defaultdict

import re

# 获取输入
n = int(input())
input_arr = input().split()

# 算法入口
def process_input():
    result = []

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

    for string in input_arr:
        match = pattern.search(string)

        if match is None:
            continue

        content = match.group(1)
        index = int(match.group(2)) - 1

        result.append([index, content])

    result.sort(key=lambda x: x[0])

    return " ".join(map(lambda x: x[1], result))

# 调用算法
print(process_input())