Appearance
HJ66 配置文件恢复
本节目标:理解“HJ66 配置文件恢复”的核心思路,并能把它用于实际开发或面试表达。 中等 通过率:35.89% 时间限制:1秒 空间限制:32M 描述 有6条配置命令,它们执行的结果分别是:
| 命 令 | 执 行 |
| reset | reset what |
| reset board | board fault |
| board add | where to add |
| board delete | no board at all |
| reboot backplane | impossible |
| backplane abort | install first |
| he he | unknown command |
注意:he he不是命令。
为了简化输入,方便用户,以“最短唯一匹配原则”匹配(注:需从首字母开始进行匹配): 1、若只输入一字串,则只匹配一个关键字的命令行。例如输入:r,根据该规则,匹配命令reset,执行结果为:reset what;输入:res,根据该规则,匹配命令reset,执行结果为:reset what; 2、若只输入一字串,但匹配命令有两个关键字,则匹配失败。例如输入:reb,可以找到命令reboot backpalne,但是该命令有两个关键词,所有匹配失败,执行结果为:unknown command 3、若输入两字串,则先匹配第一关键字,如果有匹配,继续匹配第二关键字,如果仍不唯一,匹配失败。 例如输入:r b,找到匹配命令reset board 和 reboot backplane,执行结果为:unknown command。 例如输入:b a,无法确定是命令board add还是backplane abort,匹配失败。 4、若输入两字串,则先匹配第一关键字,如果有匹配,继续匹配第二关键字,如果唯一,匹配成功。例如输入:bo a,确定是命令board add,匹配成功。 5、若输入两字串,第一关键字匹配成功,则匹配第二关键字,若无匹配,失败。例如输入:b addr,无法匹配到相应的命令,所以执行结果为:unknow command。 6、若匹配失败,打印“unknown command”
注意:有多组输入。 数据范围:数据组数: 1≤t≤800 ,字符串长度 1≤s≤20 进阶:时间复杂度:O(n) ,空间复杂度: O(n) 输入描述: 多行字符串,每行字符串一条命令 输出描述: 执行结果,每条命令输出一行 示例1 输入: resetreset boardboard addboard deletreboot backplanebackplane abort ==复制== 输出: reset whatboard faultwhere to addno board at allimpossibleinstall first
为了处理这个问题,我们可以首先将所有可能的命令及其对应的执行结果存储在一个字典中。然后,对于每一条输入命令,我们根据提供的规则来尝试匹配这些命令。以下是一个处理这个问题的Python代码示例:
初始化命令和对应结果的字典
commands = { "reset": "reset what", "reset board": "board fault", "board add": "where to add", "board delete": "no board at all", "reboot backplane": "impossible", "backplane abort": "install first" } def match_command(input_command): input_parts = input_command.split() # 将输入命令分割成单词 matches = [] for command in commands: command_parts = command.split() # 将每个可能的命令也分割成单词
根据输入单词的数量和命令单词的数量进行匹配
if len(input_parts) == len(command_parts) and all(cp.startswith(ip) for cp, ip in zip(command_parts, input_parts)): matches.append(command) # 添加匹配到的命令
根据匹配到的命令数量决定输出
if len(matches) == 1: return commands[matches[0]] else: return "unknown command"
循环读取并处理每一行输入直到EOF
try: while True: input_command = input().strip() print(match_command(input_command)) except EOFError: pass
这段代码首先定义了一个字典 commands,包含所有可能的命令及其对应的执行结果。match_command 函数尝试根据输入匹配命令。它首先将输入命令分割成单词,然后遍历所有可能的命令,检查命令是否以输入的每个单词开始。如果找到唯一匹配的命令,它返回该命令的执行结果;如果没有找到匹配的命令或找到多个匹配的命令,它返回“unknown command”。
这种方法根据题目描述实现了“最短唯一匹配原则”,并且可以处理多组输入直到输入结束。对于给定的示例输入,这段代码能够正确输出各个命令的执行结果。
这行代码是Python中的一个非常强大的表达式,利用了列表推导(List Comprehension)和 zip 函数。我们来分步骤地解释它的作用:
目标
这行代码的目的是检查用户输入的命令(分割成多个部分,即input_parts)是否能够匹配到预定义命令列表中的某个命令(也分割成多个部分,即command_parts)。规则是,每个预定义命令的每一部分都必须以用户输入命令的对应部分开头。
zip 函数
zip(command_parts, input_parts) 将两个列表的相应元素配对,形成一个元组的序列。每个元组包含两个元素,第一个来自 command_parts(预定义命令的一部分),第二个来自 input_parts(用户输入命令的一部分)。
循环
for cp, ip in zip(command_parts, input_parts) 遍历上述元组的序列,每次循环中,cp 是预定义命令的一部分,ip 是用户输入命令的一部分。
条件表达式
cp.startswith(ip) 检查预定义命令的这一部分(cp)是否以用户输入命令的相应部分(ip)开头。这个方法返回一个布尔值(True 或 False)。
列表推导
all(...) 函数接收一个迭代器,并且当迭代器中所有元素都为 True 时,返回 True。在这个场景中,它检查是否所有配对的命令部分都满足 startswith 条件。
综合解释
所以,这整行代码 all(cp.startswith(ip) for cp, ip in zip(command_parts, input_parts)) 检查用户输入的每个命令部分是否都是预定义命令相应部分的前缀。如果整个用户输入都符合这个规则,这表达式结果为 True,表示用户的输入与这个预定义命令匹配;否则,结果为 False。
这种方式非常有效地实现了对命令的“最短唯一匹配原则”的检查,同时保持了代码的简洁性。
import sys
def get_result(input_commands): inner_command_map = { "reset": "reset what", "reset board": "board fault", "board add": "where to add", "board delete": "no board at all", "reboot backplane": "impossible", "backplane abort": "install first", } inner_commands = inner_command_map.keys() def get_matches(user_command_str): user_command_parts = user_command_str.split() matches = [] for inner_command in inner_commands: result = [] inner_command_parts = inner_command.split() if len(inner_command_parts) == len(user_command_parts): for idx, ic in enumerate(inner_command_parts): if not ic.startswith(user_command_parts[idx]): break else: result.append(ic) else: continue if len(result) == len(inner_command_parts): matches.append(inner_command_map[inner_command]) if len(matches) == 1: return matches[0] else: return 'unknown command' match_result = [get_matches(ic) for ic in input_commands] return match_result
input_commands = [line.strip() for line in sys.stdin] for i in get_result(input_commands): print(i)
