华为OJ西研所训练题——配置文件恢复(欢迎讨论)

描述: 
有6条配置命令,它们执行的结果分别是:

命   令 执   行

reset reset what

reset board board fault

board add where to add

board delet no board at all

reboot backplane impossible

backplane abort install first

he he unkown command

注意:he he不是命令。

为了简化输入,方便用户,以“最短唯一匹配原则”匹配:

1、若只输入一字串,则只匹配一个关键字的命令行。例如输入:r,根据该规则,匹配命令reset,执行结果为:reset what;输入:res,根据该规则,匹配命令reset,执行结果为:reset what;

2、若只输入一字串,但本条命令有两个关键字,则匹配失败。例如输入:reb,可以找到命令reboot backpalne,但是该命令有两个关键词,所有匹配失败,执行结果为:unkown command

3、若输入两字串,则先匹配第一关键字,如果有匹配但不唯一,继续匹配第二关键字,如果仍不唯一,匹配失败。例如输入:r b,找到匹配命令reset board,执行结果为:board fault。

4、若输入两字串,则先匹配第一关键字,如果有匹配但不唯一,继续匹配第二关键字,如果唯一,匹配成功。例如输入:b a,无法确定是命令board add还是backplane abort,匹配失败。

5、若输入两字串,第一关键字匹配成功,则匹配第二关键字,若无匹配,失败。例如输入:bo a,确定是命令board add,匹配成功。

6、若匹配失败,打印“unkonw command”

题目类别:  字符串 
难度:  高级 
运行时间限制: 10Sec
内存限制: 128MByte
阶段:  入职前练习 
输入:

多行字符串,每行字符串一条命令

输出:

执行结果,每条命令输出一行

样例输入:
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

代码提交有一组数据没过,test7不知道是什么测试数据,希望各位网友批评指正~(待完善)

#include<iostream>
#include<string>
using namespace std;
/*
有6条配置命令,它们执行的结果分别是:

命   令 执   行
reset reset what
reset board board fault
board add where to add
board delet no board at all
reboot backplane impossible
backplane abort install first
he he unkown command
  */
static string comm1[]={"reset","reset what"};//0,2
static string comm2[]={//5,2
	"reset board#board fault",
	"board add#where to add",
	"board delet#no board at all",
	"reboot backplane#impossible",
	"backplane abort#install first"
};
static string comm3[]={
	"board fault",
	"where to add",
	"no board at all",
	"impossible",
	"install first"
};
int main()
{
	string a[3];
	int i,j,k,secstart,flag,comm2black;
	int ok[5]={0};
	char b[20];
//	getline(cin,a);
	while(cin.getline(b,20)){
		if(strlen(b)==0)continue;
	//	cout<<b<<endl;

		flag=0;
		memset(ok,0,sizeof(ok));
		for(i=0;i<strlen(b);i++)
		{
			if(b[i]==' ')
			{
				flag++;
				if(flag>1)break;
				secstart=i+1;
			}

		}
	//	cout<<strlen(b)<<" "<<flag<<" "<<secstart<<endl;

		if(flag>1)
		{
			cout<<"unkown command"<<endl;

		}
		else if(flag==0)
		{
			for(i=0;i<strlen(b);i++)
				if(b[i]!=comm1[0][i])
				{
					cout<<"unkown command"<<endl;
					break;
				}
			if(i==strlen(b)) cout<<comm1[1]<<endl;
		}
		else
		{
			for(j=0;j<5;j++){
				for(i=0;b[i]!=' ' && comm2[j][i]!=' ';i++)
				{
					if(b[i]!=comm2[j][i])break;
				}
				if(b[i]==' ')ok[j]=1;
			}

			for(j=0;j<5;j++)
			{

				if(ok[j]==1)
				{

					ok[j]=0;
					for(i=0;comm2[j][i]!=' ';i++);
					comm2black=i+1;
					for(i=secstart,k=comm2black;i<strlen(b) && comm2[j][k]!='#';i++,k++)
					{
						if(b[i]!=comm2[j][k])break;
					}
					if(i==strlen(b))ok[j]=1;
				}
			}
		//	for(i=0;i<5;i++)
		//		cout<<ok[i]<<" ";
		//	cout<<endl;
			secstart=0;
			for(i=0;i<5;i++)
			{
				if(ok[i]==1) flag=i;
				secstart+=ok[i];
			}
			//cout<<flag<<" "<<secstart<<endl;
			if(secstart!=1) cout<<"unkown command"<<endl;
			else cout<<comm3[flag]<<endl;
		}
	}
	return 0;
}
时间: 2024-11-03 01:17:00

华为OJ西研所训练题——配置文件恢复(欢迎讨论)的相关文章

华为OJ训练题之 比赛情况统计

题目如下: 比赛情况统计 有一个游戏平台,各个参赛队伍(以唯一的TeamID来标识)之间进行单循环的对抗赛,两个队伍之间只举行一场比赛,比赛以得分的多少定胜负.需要完成一个统计赛况的程序,能够随时查询指定队伍的最新赛况:包括胜.平.负的局数,当前总积分以及名次. 说明:循环赛没有全部结束时也可以查询某个队伍的最新赛况 规则说明 比赛判定:两个队伍中得分高的一方为胜者,另一方为负者:得分相同则为平局 积分规则:每一局比赛: 胜者积3分;平局双方各积1分; 负者积0分 排名规则:按照当前总积分的高低

华为OJ训练 之 括号配对数目问题

题目如下 括号配对问题 输入n个括号,输出能组合的n个括号组合,例如-- 输入1时,只有()一种: 输入2时,有()()和(())两种: 输入3时,有()()(),()(()),(())(),(()())和((())),共5种. 输入4时有14种..依次类推. 我想到的笨方法,类推找规律,因为我相信这个肯定有个公式的.找了好一会.没总结出来,于是翻书,因为印象中看过类似的题. 然后找到了公式.哈哈. import java.util.Scanner; public class Main { pu

华为OJ:2041 放苹果

这道题难点不在于代码怎么写,而是思路怎么想.感觉一般这种题要么你理好一个思路要么你最后总结出一个公式,要么你自己模拟它的运作方式,用迭代,或者递归的方式来做.有点像我们以前学的排列组合. 对于m个苹果,n个盘子f(m,n),如果苹果个数比盘子少,那么就跟n个盘子,n个苹果是一样的f(n,n).如果m比n大,那么有两种情况,一种有空盘子的情况,一种没有空盘子的情况,两种情况不重叠且加一起一定为情况总数.第一种情况就即为n个盘子放在m-1个盘子里,因为至少有个空盘子.f(m,n-1),第二种情况下,

【华为OJ】【090-合唱队】

[华为OJ][算法总篇章] [华为OJ][090-合唱队] [工程下载] 题目描述 计算最少出列多少位同学,使得剩下的同学排成合唱队形 说明: N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2-,K,他们的身高分别为T1,T2,-,TK, 则他们的身高满足存在i(1<=i<=K)使得T1<T2<......<Ti-1<Ti>Ti+1>......>

华为OJ题目

题目描述: 新入职华为的小伙伴们都有在oj上面刷题的任务,共需要刷100道初级题,45道中级题,5道高级题,其中,做出来的高级题如果超标可以当初级或者中级题,做出来的中级题如果超标可以当初级题.每天,出题的大哥会给大家出Xi道题,这Xi道题属于同一个难度级别,小伙伴们要么用一天时间把这些题全做出来,要么就不做.现在,给你每天出题大哥出的题数以及难度,请问,小伙伴们最少要挑选其中几天去做题,才能把这150道题的任务完成呢? 输入示例: 5 100 70 5 5 55 1 2 2 2 3 输出: 2

华为OJ:查找输入整数二进制中1的个数

不得不说这道题就是一道十分蛋疼的题,我本来想着对输入的整数K对1按位与运算,然后再将K向右移一位,循环这样做,知道K为0. 万万没想到,程序一直超时,莫名其妙,看讨论上说是因为这编译器高位补零,还能不能再坑一点. import java.util.Scanner; public class binarySystemOneNumber { public static int findNumberOf1(int k){ int count=0; int num=1; for(int i=1;i<=I

【华为OJ】【021-汽水瓶】

[华为OJ][算法总篇章] [华为OJ][021-汽水瓶] [工程下载] 题目描述 有这样一道智力题:"某商店规定:三个空汽水瓶可以换一瓶汽水.小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?" 答案是5瓶,方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以后4个空瓶子,用3个再换一瓶, 喝掉这瓶满的,这时候剩2个空瓶子.然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用3个空瓶子换一瓶满的还给老板. 如果小张手上有n个空汽水瓶,最多可以换多少瓶汽水喝? 输入描述 输入文件

华为OJ: 求小球落地5次后所经历的路程和第5次反弹的高度

学过自由落体就好,初中物理题. import java.util.Scanner; public class reboundFiveTimes { public static void main(String args[]){ Scanner input=new Scanner(System.in); int k=input.nextInt(); double high=k/32.0; double distance=k*23/8.0; System.out.println(distance);

【华为OJ】201301 JAVA 题目0-1级 将数组分为相等的两组

描述:  编写一个函数,传入一个int型数组,返回该数组能否分成两组,使得两组中各元素加起来的和相等,并且,所有5的倍数必须在其中一个组中,所有3的倍数在另一个组中(不包括5的倍数),能满足以上条件,返回true:不满足时返回false. 知识点: 语言基础,字符串,循环,函数,指针,枚举,位运算,结构体,联合体,文件操作,递归    题目来源: 内部整理  练习阶段: 初级  运行时间限制: 10Sec 内存限制: 128MByte 输入: 输入输入的数据个数 输入一个int型数组 输出: 返