现在的位置: 首页 > 综合 > 正文

华为编程大赛–判断给定数是否满足给定条件要求

2019年04月09日 ⁄ 综合 ⁄ 共 1511字 ⁄ 字号 评论关闭

        第一次参加华为编程大赛的最后一题,现在回过来看了一下,发现要做完要3个多小时,比赛时间才3小时,还是要加紧练习。另外,答案也不知道是不是所有用例都能测试通过,就是捣腾了一下。。。。见笑。 

2.3 题目:判断给定数是否满足给定条件要求

2.3.1 题目描述:

说明:
1、 条件是一个字符串,其格式由数学上的“开闭区间”,"&&"和"||"组成。其格式为:[5,7]&&(6,9]||(10,20),该条件表示“大于等于5,小于等于7”并且“大于6,小于9”或者“大于10,小于20”。
2、 &&优先级高于||。

2.3.2 输入:

1、 字符串1:上述描述格式的条件:如[5,7]&&(6,9]||(10,20)

2、 数字:判断是否满足条件的数字:9
说明:上诉两个参数是在一行中输入的,其格式为:字符串1+空格+数字。如[1,2]||(3,4) 3

2.3.3 输出:

如果满足条件,则输出1,否则0。

2.3.4 样例输入:

[1,2]||(3,4] 3

2.3.5 样例输出:

0

代码:

 

#include <cstdio>
#include <stack>
#include <cstdlib>
#include <ctype.h>
using namespace std;
#define MAXN 100

stack<char> s;
stack<char> v;

int main()
{
	//freopen("in.txt","r",stdin);
	char buf[MAXN];
	char num[32],ch[32],a;
	memset(num,32*sizeof(char),'0');
	int b,flag;
	int i,j,ok,value;
	while(2 == scanf("%s%s",&buf,&ch))
	{
		sscanf(ch,"%d",&value);
		for(i=0;i<=strlen(buf);i++)
		{
			if( (i<strlen(buf)) ? (buf[i] != '|') : (i != strlen(buf)) )
			{
				if(isdigit(buf[i]) || buf[i] == ',')
					v.push(buf[i]);
				else if(buf[i] == '&')
				{
					v.push(',');
					
					i++;
				}
				else
					s.push(buf[i]);

				//printf("%c\n",s.top());
			}
			else
			{
				i++;
				while(!s.empty() && !v.empty())
				{
					j=31;
					while(!v.empty() && v.top() != ',')
					{
                        num[j--] = v.top();
						v.pop();
					}
					if(!v.empty() && v.top() == ',')
						v.pop();
					sscanf(num,"%d",&b);

					a = s.top();
					s.pop();
					ok = 1;
					if(a == ']')
					{
						if(value > b)
						{
							ok = 0;
							break;
						}
							
					}
					else if(a == ')')
					{
						if(value >= b)
						{
							ok = 0;
							break;
						}
							
					}
					else if(a == '[')
					{
                         if(value < b)
						 {
							 ok = 0;
							 break;
						 }
							 
					}
					else if(a == '(')
					{
						 if(value <= b)
						 {
							 ok = 0;
						     break;
						 }
							 
					}
					else
					{
						if(!s.empty())
							s.pop();
					}

				}
				if(ok)
				{
					flag = 1;;
					break;
				}
				else
				{
					while(!s.empty())
						s.pop();
					while(!v.empty())
						v.pop();
					flag = 0;
				}
			}
		}
		printf("%d\n",flag);
	}


	
	return 0;
}

 思想很简单,就是一直读入字符串,读到“||”时就判断该数是否匹配栈内剩余的区间,如果匹配则直接返回1,否则继续读入以后的区间直到数据读完位置。

抱歉!评论已关闭.