首页 > ACM题库 > 九度OJ > 九度-1101-计算表达式[解题代码]
2013
12-12

九度-1101-计算表达式[解题代码]

题目来源:2010年上海交通大学计算机研究生机试真题

题目描述:

对于一个不存在括号的表达式进行计算

输入:

存在多种数据,每组数据一行,表达式不存在空格

输出:

输出结果

样例输入:
6/2+3+3*4
样例输出:
18

java 代码如下:
import java.io.BufferedInputStream;
import java.util.*;
import java.util.regex.*;
public class Main {
	static String str;
	static StringBuffer sb;
	static String arr[] = {"*","/","+","-"};
	public static void main(String[] args) {
		Scanner s = new Scanner(new BufferedInputStream(System.in));
		while(s.hasNext()){
			str = s.next();
			sb = new StringBuffer(str);
			for(int i=0; i<4; i++){
				Pattern p = Pattern.compile("(\\d+)\\"+arr[i]+"(\\d+)");
				Matcher m = p.matcher(sb);
				while(m.find()){
					int a = Integer.parseInt(m.group(1));
					int b = Integer.parseInt(m.group(2));
					switch(i){
					case 0: a = a*b;break;
					case 1: a = a/b;break;
					case 2: a = a+b;break;
					case 3: a = a-b;break;
					}
					sb.replace(m.start(), m.end(), a+"");
					m.reset();
				}
			}
			System.out.println(sb.toString());	
		}
	}
}
/**************************************************************
	Problem: 1101
	User: coder
	Language: Java
	Result: Accepted
	Time:170 ms
	Memory:15932 kb
****************************************************************/


  1. 第二个方法挺不错。NewHead代表新的头节点,通过递归找到最后一个节点之后,就把这个节点赋给NewHead,然后一直返回返回,中途这个值是没有变化的,一边返回一边把相应的指针方向颠倒,最后结束时返回新的头节点到主函数。

  2. 算法是程序的灵魂,算法分简单和复杂,如果不搞大数据类,程序员了解一下简单点的算法也是可以的,但是会算法的一定要会编程才行,程序员不一定要会算法,利于自己项目需要的可以简单了解。

  3. 您没有考虑 树的根节点是负数的情况, 若树的根节点是个很大的负数,那么就要考虑过不过另外一边子树了

  4. 给你一组数据吧:29 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 1000。此时的数据量还是很小的,耗时却不短。这种方法确实可以,当然或许还有其他的优化方案,但是优化只能针对某些数据,不太可能在所有情况下都能在可接受的时间内求解出答案。

  5. #include <cstdio>
    #include <algorithm>

    struct LWPair{
    int l,w;
    };

    int main() {
    //freopen("input.txt","r",stdin);
    const int MAXSIZE=5000, MAXVAL=10000;
    LWPair sticks[MAXSIZE];
    int store[MAXSIZE];
    int ncase, nstick, length,width, tmp, time, i,j;
    if(scanf("%d",&ncase)!=1) return -1;
    while(ncase– && scanf("%d",&nstick)==1) {
    for(i=0;i<nstick;++i) scanf("%d%d",&sticks .l,&sticks .w);
    std::sort(sticks,sticks+nstick,[](const LWPair &lhs, const LWPair &rhs) { return lhs.l>rhs.l || lhs.l==rhs.l && lhs.w>rhs.w; });
    for(time=-1,i=0;i<nstick;++i) {
    tmp=sticks .w;
    for(j=time;j>=0 && store >=tmp;–j) ; // search from right to left
    if(j==time) { store[++time]=tmp; }
    else { store[j+1]=tmp; }
    }
    printf("%dn",time+1);
    }
    return 0;
    }