面试遇到的一个奇葩题目 求大神们解答!!!

TuskueNeko 2014-03-18 04:51:00
加精
题目大致是 String eveal(String s) 意思是这个方法要返回一个结果 输入参数是一个字符串形式的 算式 如 (1+1)*3/2+1这样形式的字符串 你要返回结果
...全文
7426 102 打赏 收藏 转发到动态 举报
写回复
用AI写文章
102 条回复
切换为时间正序
请发表友善的回复…
发表回复
戚辰先生 2014-06-30
  • 打赏
  • 举报
回复
学习了!学习了!学习了!
UncleLi__ 2014-06-28
  • 打赏
  • 举报
回复
确实是栈中的中序转后序的问题
vantoo1 2014-06-24
  • 打赏
  • 举报
回复
引用 14 楼 u012280292 的回复:
引用 13 楼 haha_321 的回复:
[quote=引用 10 楼 u012280292 的回复:] [quote=引用 8 楼 haha_321 的回复:] 记得有个java处理js的方法叫eval 是不是这个方法?
这是js的 题目要求用 java写
public static void jsTest(){
		ScriptEngineManager mgr = new ScriptEngineManager(); 
		ScriptEngine engine = mgr.getEngineByName("JavaScript");
		try{
			String script = "function js(){return (1+1)*3/2+1; }";
			engine.eval(script);
			Invocable inv = (Invocable) engine;   
			Double res=(Double)inv.invokeFunction("js");   
			System.out.println(res);    
		}catch(Exception e){
			e.printStackTrace();
		}

	}
不知道这个可以不,仅供参考。[/quote]可以得出结果 但是为什么 要写js代码? 求原理[/quote] 使用了js引擎啊,js实现了这个,java调用js来实现
chaofengwang09 2014-05-15
  • 打赏
  • 举报
回复
这不是那个中缀转后缀算法吗?
争光901023 2014-05-08
  • 打赏
  • 举报
回复
数据结构树的遍历方式,你可以看看,貌似是书上例题。。。
Strong_light 2014-04-11
  • 打赏
  • 举报
回复
引用 13 楼 haha_321 的回复:
引用 10 楼 u012280292 的回复:
[quote=引用 8 楼 haha_321 的回复:] 记得有个java处理js的方法叫eval 是不是这个方法?
这是js的 题目要求用 java写
public static void jsTest(String strValue){
		ScriptEngineManager mgr = new ScriptEngineManager(); 
		ScriptEngine engine = mgr.getEngineByName("JavaScript");
		try{
			String script = "function js(){return "+strValue+"; }";
			engine.eval(script);
			Invocable inv = (Invocable) engine;   
			Double res=(Double)inv.invokeFunction("js");   
			System.out.println(res);    
		}catch(Exception e){
			e.printStackTrace();
		}

	}
不知道这个可以不,仅供参考。[/quote] 学习大神了
Xiaofeng_Bu 2014-04-11
  • 打赏
  • 举报
回复
#include <iostream>
#include <stack>
#include <string>
using namespace std;
/*规则:从左到右遍历中缀表达式的每一数字和符号,若是数字就输出,
即成为后缀表达式的一部分;若是符号,则判断其与栈  顶符号的优先
级,是右括号或优先级低于栈顶符号(乘除优先加减)则栈顶元素依次
出栈并输出,并将当前符号进栈,一直到最终输出后缀表达式为止。
*/
void suff(string &exp ,string & post)
{
	stack<char> p;
	int i;
	int m;
	char a;
	for(i=0;exp[i]!='#';i++)
	{
		if(exp[i]>='0'&&exp[i]<='9')
		{
			post+=exp[i];
		}
		else
		{
			if(p.size()==0||exp[i]=='(')
			{
				p.push(exp[i]);
			}
			else if(exp[i]==')')
			{
				m=p.size();
				while(m)
				{
					a=p.top();
					p.pop();
					if(a=='(')
					{
						break;
					}
					post+=a;
					m--;

				}
			}
			else if(exp[i]=='+'||exp[i]=='-')
			{
				if(p.top()=='*'||p.top()=='/')
				{
					m=p.size();
					while(m)
					{
						a=p.top();
						p.pop();
						post+=a;
						m--;
					}
				}
				else
				{
					p.push(exp[i]);
				}
			}
			else
			{
				p.push(exp[i]);
			}
		}
	}
	if(p.size())
	{
		m=p.size();
		while(m)
		{
			a=p.top();
			p.pop();
			post+=a;
			m--;
		}
	}
	cout<<post<<endl;

}
void calculate(string & post)
{
	stack<int> q;
	int i;
	int a,b;
	for(i=0;post[i]!='\0';i++)
	{
		if(post[i] >= '0' && post[i] <= '9')
			q.push(post[i]-48);
		else                                         //当前元素为符号则取出栈顶两个元素计算,并把计算结果入栈;
		{
			a = q.top();
			q.pop();
			b = q.top();
			q.pop();
			switch(post[i])
			{
			case '+' : q.push(a+b); break;
			case '-' : q.push(b-a); break;
			case '*' : q.push(a*b); break;
			case '/' : q.push(b/a); break;
			}
		}
	}
	a = q.top();
	cout << a << endl;
}
Raise 2014-03-30
  • 打赏
  • 举报
回复
这是中缀表达式转换成逆波兰式或者波兰式,转化成逆波兰式的话,可以用一个栈算出结果。
sca4441479 2014-03-27
  • 打赏
  • 举报
回复
除了楼上说的 用JAVA 调用JS外,觉得就只有写一个计算器的核心代码了。
蟑螂-roach 2014-03-26
  • 打赏
  • 举报
回复
引用 89 楼 roach_laojiang 的回复:
各位兄台不用那么麻烦,有现成的,我刚做的项目有用到这个计算规则,楼主结贴给分吧 用这个jar:commons-jexl,直接度娘吧
直接给你代码吧,
  • 打赏
  • 举报
回复
引用 3 楼 lgc8023 的回复:
引用 2 楼 u012280292 的回复:
[quote=引用 1 楼 lgc8023 的回复:] 先将字符串里的数值强行转化成int型,再做处理
你的意思是用 正则表达式? 否则的话 里面的 运算符不好判断
你可以这样: int a = Integer.parseInt(str.charAt(1)+""); int b = Integer.parseInt(str.charAt(3)+""); int c = Integer.parseInt(str.charAt(6)+""); int d = Integer.parseInt(str.charAt(8)+""); int e = Integer.parseInt(str.charAt(10)+""); int sum=(a+b)*c/d+e [/quote] 楼主要的应该不是转换的方法 要的是处理字符串算式顺序的问题
神-气 2014-03-25
  • 打赏
  • 举报
回复
引用 85 楼 wenhaoxp1987 的回复:
[quote=引用 46 楼 ADF1230 的回复:] 1,用栈来算; 2,编译原理中的DFA分析词法,LL(1)分析文法,再遍历子节点,递归算结果。
正解,编译原理去做,就是实现起来。。。。[/quote] 实现也差不多是几百行代码的事。
jiayangcg 2014-03-25
  • 打赏
  • 举报
回复
引用 84 楼 likj_sh 的回复:
将字符串转换为ASC2码,再判断每个ASC2码的范围判断是数字还是符号,数字的转成INT,然后计算就可以了吧
好像你认为本题的难点是判断是数字还是符号??
wenhaoxp1987 2014-03-25
  • 打赏
  • 举报
回复
引用 46 楼 ADF1230 的回复:
1,用栈来算; 2,编译原理中的DFA分析词法,LL(1)分析文法,再遍历子节点,递归算结果。
正解,编译原理去做,就是实现起来。。。。
likj_sh 2014-03-25
  • 打赏
  • 举报
回复
将字符串转换为ASC2码,再判断每个ASC2码的范围判断是数字还是符号,数字的转成INT,然后计算就可以了吧
-Sykes 2014-03-25
  • 打赏
  • 举报
回复
传说中逆波兰表达式啊,百度一下你就知道
HaoYuan 2014-03-25
  • 打赏
  • 举报
回复
用栈和队列组合可以实现吧! 数据结构中貌似有!
ghw554557313 2014-03-25
  • 打赏
  • 举报
回复
觉得还是用js引擎api更加简洁方便
蟑螂-roach 2014-03-25
  • 打赏
  • 举报
回复
各位兄台不用那么麻烦,有现成的,我刚做的项目有用到这个计算规则,楼主结贴给分吧 用这个jar:commons-jexl,直接度娘吧
桂圆214 2014-03-24
  • 打赏
  • 举报
回复
这个的高手解决,没看明白
加载更多回复(81)

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧