要求:
/////////////////////input.txt样例////////////////////////////////
1+3/7*2=
4+2/*asjdff*/5-8=
5%2+5-2/*4=6/*i**ifdg***/*84o*/*1-2=
………………………………………        //更多表达式省略
//////////////////////////////////////////////////////////////////////////////////////output.txt样例////////////////////////////////
1+3/7*2=43
4+2/*asjdff*/*5-8=6
5%2+5-2/*4=6/*i**ifdg***/*84o*/*1-2=??
………………………………………        //更多表达式省略
/////////////////////////////////////////////////////////////
1.要求用JAVA实现。
2.若在命令行参数中指明了 input.txt 和 output.txt,请计算出input.txt中每一行表达式的值,并写入到output.txt文件中
3.2.若在命令行参数中只指明了 input.txt,则新建一个output.txt,计算出input.txt中每一行表达式的值,并写入到output.txt文件中
3.若在命令行参数中没有指明 input.txt 和 output.txt,则输入一个类似4+2/*asjdff*/*5-8这样的表达式,计算1000次这个表达式的值,在屏幕中输出结计算结果和所用时间。
4.要求最多在180分钟内完成。提示(我加的):1.可以先过滤掉表达式中的注释(/*和*/之间的东东)

解决方案 »

  1.   

    华为JAVA题目是这样??有意思!
      

  2.   

    这是华为2005年中央平台开发部的JAVA比武大赛中的必做题,当时难倒了一批人!
      

  3.   

    用Regular Expressions和Scanner可以轻松搞定。问题是这样的东西有意义么?这种题是无聊的公司的最爱,这种鸟公司去了也是浪费青春。
      

  4.   

    lei si ren de gongsi.chu zhe zhong bt ti.
      

  5.   

    "这是华为2005年中央平台开发部的JAVA比武大赛中的必做题,当时难倒了一批人!"说明华为的开发部一批人没有学过编译原理呗
      

  6.   

    学过算法的都知道栈可以很好的解决这个问题,不就是变相的表达式求职。pre:
      建立一个表达式优先级线性表,如+-/%*()等
      建立一个源数组
      建立一个结果数组
    1 IO操作将每一行读入数组,
        1.1 使用正则替换注释。
        1.2 逐个把此行的每个操作符(数)压栈。
        1.3 压栈优先级相等时计算,并将结果存入结果数组2 IO操作建文件。
        2.1将源数组的每一行+结果每一行写入文件的每一行完毕。真的很简单,华为让我很失望。
      

  7.   

    为什么说这种题是垃圾?这道题里包含了许多精髓的东西:树(二叉树),堆栈(优先级)等经典的东西在里面。
    既然是比武,就应该这样,都是hello world还比什么?能够又快又正确的完成这类题的人,才是真正的强。说这些是垃圾的人永远都是coder.
      

  8.   

    题目里面规定有没有括号?
    有没有平方之类的?
    如果只是要实现,不计较算法的话,我想可以在JAVA里面读文件,然后输出一个JAVA文件,里面有这句表达式,然后编译运行出结果,读输出后写入文件.
      

  9.   

    其他的不多说, 看看事实: 
    《华为员工加班之死》
    http://info.china.alibaba.com/news/detail/v5003013-d5714028.html
      

  10.   

    懒人做法:
    bsh.Interpreter itpt = new bsh.Interpreter();System.out.println(itpt.eval(表达式));
      

  11.   

    不过做这种题目好像是要把编译原理学得好一点
    这个是纯粹得编译
    用java就是外行做这个题目
    应为没有人会用java写编译器
    但是就数据结构方面训练一下
    还是可以得
      

  12.   

    java里没有像javascript中的eval方法吧。
    不知道javascript中的eval是用什么结构实现的,也是栈么?
    实现一个这样的方法,然后每读取一行用正则表达式替换后,就调用一下。
      

  13.   

    用栈就可以解决问题,但是要真正的做对,没有BUG
    180分钟的时间,有点紧。
      

  14.   

    这个用什么语言实现都可以吧?谈什么最好的Java水平测试?就不信会了这道题就是Java的绝顶高手了.
      

  15.   

    Waste Time~ just so so
      

  16.   

    讨论没意思的东西,无聊这道题无非是数据结构中的一些基本操作
    要做出来很简单但是说什么最好的java测试题就错了,这应该说是数据结构方面的测试!
      

  17.   

    用得着那么费事吗?
    eval 不是一句搞定?
      

  18.   

    路过,今年我参加华为的笔试的时候题目不是很难。我做对了,但是他的题出错了,我提出了,呵呵,面试的人都不怎么懂java。唉,所以我放弃了华为
      

  19.   

    华为缺的不是高手级的程序员,
    华为缺的是 系统分析师和软件架构师,号称通过最牛的CMM5认证,可是问问你们那帮coder,什么是需求采集,他们知道么?
       建议你们每月的大比武去比这些,而不要适得其反。
    华为的软件,用过了,那不是一个晕字吐字了得,那是一个疯啊!
      
      java应该是南研所这帮清华的高人在搞,还美其名曰多媒体业务开发,其实就是一帮高手被关在互不相通的屋子里闭门造车!  华为,你还是把软件外包了让别搞去吧,虽然印度没有搞定,但国内能给你打工的软企应该不少,何必干这种费力费财费人又不讨用户好不讨订单好不讨自己钱包好的事!  我只能用一个不懂软件的老头的话总结华为的软件:华为搞硬件出身,搞软件怕是有点自欺欺人!
      

  20.   

    我个人觉得,能做这个题的一辈子是coder!,不会做的,将来估计是项目经理或者CEO,或者
      

  21.   

    这个问题对于编译或解析来说还是瞒有意义的,而且产品要做到层次高,高可定制化,没有这些东西玩不转。我想步骤可能需要
    1. 清除注释
    2. 构建二叉树,分解计算因子
    3. 实现计算过程
    4. 将结果写入output文件不过偶水平低,花不起那么多时间,用第三方控件啦^_^
      

  22.   

    真受不了啊,上面很多人我怀疑是不是程序员啊,是不是都把自己当CEO,CTO啊?如果你觉得这些题目很垃圾,你可以贴出你的代码来啊,看看你的水平高到什么地步,什么都不说就上来骂题目烂,这个也太数据结构、编译原理难道不重要吗?如果大家都会了为什么在CSDN的论坛还有N多人问这个正则那个正则怎么写??大家还是老实一点做题目吧,等做出来,并且你的方法是很优化的,再骂也不迟!
      

  23.   

    编译原理---->清除注释
    数据结构---->栈--->计算结果
    Java文件操作
      

  24.   

    http://bugonline.net 在线的BUG管理系统.刚才花了2个小时做了一个 c#版的 四则运算,支持+-*/ 呵呵。代码如下:
    不过说一下,很多华为的员工 都跳到我们公司。因我们从不用加班。using System;
    using System.Collections.Generic;
    using System.Text;namespace ConsoleStudy
    {
      public  class Arithmetic
        {
            public static int CalcIt(string input)
            {
                List<string> inputs = split(input);
                while (inputs.Count > 1)
                {
                    inputs = CalcBody(inputs);
                }
                return int.Parse(inputs[0]);
            }        private static List<string> CalcBody(List<string> inputs)
            {
                Stack<string> stack = new Stack<string>();            CommandChar preCom = new CommandChar(' ');
                foreach (string c in inputs)
                {
                    if (isOper(c))
                    {
                        CommandChar cc = new CommandChar(c[0]);                    if (CommandChar.BjPri(preCom, cc) >= 0)
                        {
                            string n2 = stack.Pop();
                            string o = stack.Pop();
                            string n1 = stack.Pop();
                            string r = Arithmetic.calc(n1, o, n2);                        stack.Push(r);
                        }                    stack.Push(c);
                        preCom = cc;
                    }
                    else
                    {
                        stack.Push(c);
                    }
                }
                inputs.Clear();            if (stack.Count > 3)
                {
                    while (stack.Count > 0)
                    {
                        inputs.Add(stack.Pop());
                    }
                }
                else
                {
                    string n2 = stack.Pop();
                    string o = stack.Pop();
                    string n1 = stack.Pop();
                    string r = Arithmetic.calc(n1, o, n2);                inputs.Add(r);
                }            return inputs;
            }        public static List<string> split(string input)
            {            List<string> ls = new List<string>();
                string s = string.Empty;
                foreach (char c in input)
                {
                    if (isOper(c))
                    {
                        if (s != string.Empty)
                        {
                            ls.Add(s);
                            s = string.Empty;
                        }
                        string o = string.Empty;
                        o += c;
                        ls.Add(o);
                    }
                    else
                    {
                        s += c;
                    }            }            ls.Add(s);
                return ls;
            }        private static string calc(string n1, string Op, string n2)
            {
                int i1 = int.Parse(n1);
                int i2 = int.Parse(n2);
                int r = 0;
                switch (Op)
                {
                    case "+":
                        {
                            r = i1 + i2;
                            break;
                        }
                    case "-":
                        {
                            r = i1 - i2;
                            break;
                        }                case "*":
                        {
                            r = i1 * i2;
                            break;
                        }
                    case "/":
                        {
                            r = i1 / i2;
                            break;
                        }            }            return r.ToString();
            }        private static bool isOper(char c)
            {
                if (c == '+' || c == '-' || c == '*' || c == '/')
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }        private static bool isOper(string c)
            {
                return isOper(c[0]);
            }    }
    }
      

  25.   

    不过为了图方便,没做任何优化,也不支持小数。呵呵。只是一种实现方法。
    要完全实现试题,180分钟够呛!http://bugonline.net 在线的BUG管理系统
      

  26.   

    using System;
    using System.Collections.Generic;
    using System.Text;namespace ConsoleStudy
    {
        class Program
        {
            static void Main(string[] args)
            {
                string input = string.Empty;
                while (true)
                {
                    input = Console.ReadLine(); //"1+2+3*4";                if (input == "q")
                    {
                        break;
                    }
                    else
                    {
                        int res = Arithmetic.CalcIt(input);
                        Console.WriteLine(res);
                    }
                }
            }    }    class CommandChar
        {
            char cmdType = ' ';        public char CmdType
            {
                get { return cmdType; }
                //set { cmdType = value; }
            }
            public CommandChar(char s)
            {
                cmdType = s;
            }        public int Pri
            {
                get
                {
                    switch (cmdType)
                    {
                        case '+':
                            return 1;
                        case '-':
                            return 1;
                        case '*':
                            return 2;
                        case '%':
                            return 2;
                        default:
                            return 0;
                    }            }
            }        public static int BjPri(CommandChar c1, CommandChar c2)
            {
                return c1.Pri - c2.Pri;
            }    }}
      

  27.   

    看着和Java表达式差不多.如果不用编译原理,可以用正则替换成Java类,动态编译成Java函数,然后调用.哈哈,偷惰呀
      

  28.   

    hurrry(Hurry) ( ) 信誉:100  2006-07-04 10:07:00  得分: 0  
     
     
    用得着那么费事吗?
    eval 不是一句搞定?
      
     
    坚决同意,东西就是为了简单才写的.
      

  29.   

    用得着那么费事吗?
    eval 不是一句搞定?--
    eval 本身也要人编的,呵呵.这是检查基本功,上次去ms, 第一道题就是不能用string.Split() 和 stack,把一句话按单词倒过来 还要最省内存,这其实不就是要你编Split()函数和stack吗?http://bugonline.net 在线的BUG管理系统
      

  30.   

    版主这题有些蹊跷:
    /////////////////////input.txt样例////////////////////////////////
    1+3/7*2=
    4+2/*asjdff*/5-8=
    5%2+5-2/*4=6/*i**ifdg***/*84o*/*1-2=
    ………………………………………        //更多表达式省略
    //////////////////////////////////////////////////////////////////////////////////////output.txt样例////////////////////////////////
    1+3/7*2=43
    4+2/*asjdff*/*5-8=6
    第一个表达式1+3/7*2=43,我怎么算也算不出等于43啊,如果都是int型,觉的应该是:1+3/7*2=1啊,
    第二个表达式4+2/*asjdff*/5-8=,怎么就多了个“*"啊,4+2/*asjdff*/*5-8=6难道程序有自动添加计算符的功能
      

  31.   

    我们可以一辈子里利用别人的成果,当然,也可能一辈子买不起一栋好房子和好汽车。
    操作系统,中间件,数据库,cpu这些是一个国家必须要做的。
    而且,也正在做,你不知道而已。
    你不懂就算了,不会就算了,什么叫从来没有人做出来过?只是你见过的人里面没有人做出来过!你再想想,所谓的脑子,分析和逻辑能力全是扯淡,只有你能做别人做不了的东西,你才会有价值。像这些jsp/struts,有多少人会,入门又多么的容易,那么工资又怎么能高?日子又怎么能好?所谓的系统设计,这些是个人给他几年时间混也混成了。而又多少东西,是混不成的,这些才是提升砝码的东西。