华为机试-066-中等-HJ66.配置文件恢复
一、描述
有6条配置命令,它们执行的结果分别是:
注意: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
1.1、输入描述
多行字符串,每行字符串一条命令
1.2、输出描述
- xx
二、示例
2.1、示例1
输入:
reset
reset board
board add
board delet
reboot backplane
backplane abort
输出:
reset what
board fault
where to add
no board at all
impossible
install first
三、答案(java)
3.1、方法一
本题是关于字符串匹配的题。
先用哈希表将命令都存起来,然后再建立一个包含所有命令的字符串数组类型的哈希视图。然后用输入的字符串数组与该视图的每一个元素去匹配比较。
package com.tzq.hwod;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Map<String, String> command = new HashMap<String, String>();// 建立命令哈希表
// 向哈希表里添加命令键值对
command.put("reset", "reset what");
command.put("reset board", "board fault");
command.put("board add", "where to add");
command.put("reboot backplane", "impossible");
command.put("backplane abort", "install first");
command.put("board delet", "no board at all");
Set<String[]> order = new HashSet<String[]>();// 建立哈希命令视图
// 遍历哈希表的set视图,向哈希命令表里添加命令
for (String s : command.keySet()) {
order.add(s.split(" "));
}
while (sc.hasNextLine()) {
String input = sc.nextLine();
String[] inputChange = input.split(" ");// 将输入字符串用空格分隔,以便比较
String[] compitable = null;// 匹配的命令字符串
// 开始遍历命令视图
for (String[] cmpOrder : order) {
// 输入字符串数组长度为一
if (inputChange.length == 1) {
// 命令字符串数组长度为二,不匹配
if (cmpOrder.length == 2)
continue;
else {
// 匹配成功
if (cmpOrder[0].startsWith(inputChange[0])) {
compitable = cmpOrder;
break;
}
}
}
// 输入字符串数组长度为二的情况
if (inputChange.length == 2) {
// 如果待比较命令字符串长度为1,不匹配
if (cmpOrder.length == 1)
continue;
else
// 如果输入命令字符串与待比较命令字符串一一匹配,匹配成功
if (cmpOrder[0].startsWith(inputChange[0]))
if (cmpOrder[1].startsWith(inputChange[1])) {
compitable = cmpOrder;
break;
}
}
}
// 从哈希表中找出命令的执行结果并输出
if (compitable == null)
System.out.println("unkown command");
else if (compitable.length == 1)
System.out.println(command.get(compitable[0]));
else
System.out.println(command.get(compitable[0] + " " + compitable[1]));
}
sc.close();
}
}
四、答案(python 3)
4.1、方法一
#!/usr/bin/python
# -*- coding: UTF-8 -*-
'''
自己写的用正则匹配太low了,看了@中年美少女写的切片思想佩服了,另外不用字典免去了双层循环的做法,偷来粘在这里供大家欣赏。
'''
while True:
try:
m=input().strip().split()
key=["reset","reset board","board add","board delete","reboot backplane","backplane abort"]
value=["reset what","board fault","where to add","no board at all","impossible","install first"]
#不建字典,用列表的方式避免了双层循环,如果实在要用列表,直接用dict(zip(list1,list2))合成字典都行.
if len(m)<1 or len(m)>2: #判断当输入为小于1个或者输入大于2个字符串时,不符合命令,就报未知命令
print("unknown command")
elif len(m)==1: #当输入一个字符串
if m[0]==key[0][:len(m[0])]: #这里才是解决这个题的最佳思想,利用切片的思想来匹配
print(value[0])
else:
print("unknown command")
else:
index=[]
for i in range(1,len(key)): #这里把所有原始命令遍历,如果这里写成(len(key)+1),也就是1..6,那么下面的key[i]要改成k[i-1]才符合逻辑
a=key[i].split() #将具体的一个KEY分割成两部分
if m[0]==a[0][:len(m[0])] and m[1]==a[1][:len(m[1])]: #然后去匹配被分割的key,这里不可能有reset这种单独的,因为上面条件已经限制了。
index.append(i) #符合条件就把这个位置入列表
if len(index)!=1:
print("unknown command")
else:
print(value[index[0]]) #输出对应的value值
except:
break