华为机试-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

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tzq@2018

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值