论坛首页 Java企业应用论坛

【讨论】一个很考验逻辑的java技能鉴定题目...

浏览 11988 次
该帖已经被评为隐藏帖
作者 正文
   发表时间:2011-12-22   最后修改:2011-12-25
与大家分享下最近遇到的一个有趣的需求,看起来很简单,但是实现起来自己感觉相当麻烦,不过花了将近一天时间才实现该功能,让自己很有挫败感!希望大家积极的讨论下,希望大牛们给出比较好的解决方案。。。
稍后我会贴出自己的实现的源代码
题目:
实现1~3个数值带括号加减乘除四则运算的功能。
输入需要运算的字符表达式,返回运算以后的结果。
要求:
1、输入的表达式小于等于80个字符,超过有效长度部分不算有效表达式。

2、表达式由”+”、”-“、”*”、”/“、”0~9”、”(“、”)”字符组成,其他字符为非法字符。有非法字符输入按输入错误处理。注意空格是非法字符。

3、表达式满足的定义如下:
表达式 = 数值
表达式 = 表达式 + 运算符(“+”或”-”或“*”或”/”) + 表达式
表达式 = “(” + 表达式 +  “)”
数值 = 十进制数值

4、十进制数值由”0”~”9”数字构成,取值范围为: -32768~32767。
正数数值前缀可以带”+”,也可以不带”+”,负数数值前缀必需带”-”。
符号前缀和数值之间不能有其他字符分隔。
数值位数大于等于两位时,首位不能为数值”0”。

表达式错误提示语信息:
1.输入无效
2.除数不能为0
3.缺少左括号
4.缺少右括号
------------------------------
PS:看到被人隐藏18,我真的无语了...
看来真的是来错地方了,我的初衷只是想和大家探讨下这个问题有没有好的解决方案前提是不能使用第三方jar包,计算的表达式的算法完全靠自己对业务的理解去实现,相信真正尝试过的朋友才能体会到并不像有些网友的评论那么简单。现在看来自己实现的源码也没有必要贴出来了,该贴到此为止吧!再次感谢大家...
   发表时间:2011-12-22  
没人理哎。。。
自己实现的验证函数,验证的不是很全面,先贴出来与大家分享下,望高手手下留情。。。
/**
	 * 提示语信息
	 */
	private final String input="输入无效";  
	private final String div="除数不能为0";  
	private final String left_bracket="缺少左边括号";  
	private final String right_bracket="缺少右边括号";  
	
	/**
	 * 验证表达式格式是否合法
	 * @param cmds 表达式
	 * @return 处理结果
	 */
	private String validate(String cmds)
	{
		//长度验证 非法字符的验证
		if(!Pattern.matches("^[0-9*/()+-]{1,80}$", cmds))
			return input; 
		//语法格式的验证 :括号是否存在问题
		if(!Pattern.matches("^(\\()*([*/+-]{0,2}([^0-9]\\()*[0-9]+[)]*)*$", cmds))
			return input; 
		//判断输入的数值是否超过限制
		Pattern p=Pattern.compile("([-]{2})?\\d*");
		Matcher m=p.matcher(cmds);
		while (m.find()) {
			String str=m.group().replace("-", "");
			if(str!=null&&!"".equals(str)){
				try {
					if(Integer.parseInt(str)<-32768||Integer.parseInt(str)>32767)
						return input;
				} catch (NumberFormatException e) {
					e.printStackTrace();
					return input;
				} 
			}
		}
		//除数不能为0
		if(Pattern.matches(".*/0.*", cmds))
			return div; 
		//缺少左边括号
		//缺少右边括号
		char [] charCmds=cmds.toCharArray();
		int left=0,right=0;
		for (int i = 0; i < charCmds.length; i++) {
			if('('==charCmds[i]){
				left++;
			}
			if(')'==charCmds[i]){
				right++;
			}
		}
		if(left>right)
			return right_bracket;
		else if(left<right)
			return left_bracket;
		return null;
	}
0 请登录后投票
   发表时间:2011-12-22  
莫名其妙,居然有人投“隐藏”???
0 请登录后投票
   发表时间:2011-12-23  
难道高手都不在eye了?自己在顶下
0 请登录后投票
   发表时间:2011-12-23  
用栈吧,先进后出.....
0 请登录后投票
   发表时间:2011-12-23  
数据结构里栈的例子,没什么讨论的~
0 请登录后投票
   发表时间:2011-12-23  
表达式计算,大二的学生数据结构能及格的都会做
0 请登录后投票
   发表时间:2011-12-23  
分在企业应用栏不太好。
我以前看过一个功能应用是给员工计算工资的组合算法。
lz的这个逻辑应该能派上用场。
0 请登录后投票
   发表时间:2011-12-23  
用栈,一直压入,找到第一个“)”后,开始出栈运算,把结果入栈,然后继续……

很久不想这些了,随便想了一下
具体的自己看吧。
0 请登录后投票
   发表时间:2011-12-23  
实际上,应该是编译原理来着的
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics