• 网易2017春招笔试真题编程题集合(8)——奇怪的表达式求值


    常规的表达式求值,我们都会根据计算的优先级来计算。比如*/的优先级就高于+-。但是小易所生活的世界的表达式规则很简单,从左往右依次计算即可,而且小易所在的世界没有除法,意味着表达式中没有/,只有(+, - 和 *)。现在给出一个表达式,需要你帮忙计算出小易所在的世界这个表达式的值为多少 

    输入描述:
    输入为一行字符串,即一个表达式。其中运算符只有-,+,*。参与计算的数字只有0~9.
    保证表达式都是合法的,排列规则如样例所示。
    输出描述:
    输出一个数,即表达式的值
    输入例子:
    3+5*7
    输出例子:
    56

    这道题有自己写的代码,但是自己的同一个思路两次不同时间写出来也有些不一样。自己的代码:
    import java.util.*;
    //思路:因为输入的表达式都是合法的,所以一定是按数字+运算符号+数字+....+数字组成的
    //      所以,将输入的字符串分成只有数字和只有运算符号的数组
    public class Main{
        public static void main(String[] args) {
            Scanner sc=new Scanner(System.in);
            while(sc.hasNext()){
                String str=sc.nextLine();
                int[] number=new int[str.length()/2+1];
                char[] symbol=new char[str.length()/2];
                for(int i=0;i<str.length();i++){//将字符串分成数字和符号两个数组
                    if(i%2==0)
                        number[i/2]=str.charAt(i);
                    else
                        symbol[i/2]=str.charAt(i);
                }
                for(int i=0;i<number.length;i++){
                    number[i]=number[i]-48;//将字符'0'-'9'转换为对应的整数0-9
                }                          
                int result=number[0];
                for(int i=0;i<symbol.length;i++){
                    if(symbol[i]=='+')
                        result+=number[i+1];
                    else if(symbol[i]=='-')
                        result-=number[i+1];
                    else
                        result*=number[i+1];
                }
                System.out.println(result);
            }
            sc.close();
        }
    }
    //出现问题:直接运算时是按字符的ASCII码运算的(0-9:48-57)
    //因为字符'0'-'9'是对应的ASCII码,应转换为对应的整数0-9
    //不能用类型转换,因为转换后还是ASCII码对应的整数,减去对应的ASCII码值就可以了
     
    //自己举例运行时,又出问题,像11 2334就没转换成数字整数
    //但题目里参与计算的数字只有0~9
    
    
    
    //第二次写的
    //思路:获取输入,分别数字和运算符号两个数组,判断符号是加减乘,
    //用数字数组的两个元素进行计算,并将结果更新到数字数组的元素中,便于继续运算
    import java.util.*;
    public class Main {
        public static void main(String[] args) {
            Scanner sc=new Scanner(System.in);
            while(sc.hasNext()){
                String str=sc.nextLine();
                int len=str.length();
                int[] number=new int[len/2+1];
                String[] symbol=new String[len/2];
                for(int i=0;i<len;i++){//分成两个数组
                    if(i%2==0){
                        number[i/2]=Integer.parseInt(str.substring(i, i+1));
                    }else{
                        symbol[i/2]=str.substring(i, i+1);
                    }
                }
                for(int i=0;i<symbol.length;i++){
                    if(symbol[i].equals("+")){
                        //直接用==比较会出错,因为symbol对象和字符串+ - *是两个不同的地址
                        //equals比较的是字符串的内容
                        number[i+1]=number[i]+number[i+1];
                    }
                    else if(symbol[i].equals("-")){
                        number[i+1]=number[i]-number[i+1];
                    }
                    else{
                        number[i+1]=number[i]*number[i+1];
                    }
                }
                System.out.println(number[number.length-1]);
            }
            sc.close();
        }
    }

    答案里别人的代码:

    //https://www.nowcoder.com/test/question/done?tid=8734418&qid=83054#summary
    import
    java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String s = sc.next(); sc.close(); int tmp = s.charAt(0) - '0'; for (int i = 1; i < s.length() - 1; ) { char operate = s.charAt(i); i ++; StringBuilder sb = new StringBuilder(); while ( i < s.length() && s.charAt(i) >= '0' && s.charAt(i) <= '9') { sb.append(s.charAt(i)); i ++; } int r = Integer.valueOf(sb.toString()); switch (operate) { case '+': tmp = tmp + r; break; case '-': tmp = tmp - r; break; case '*': tmp = tmp * r; break; case '/': tmp = tmp / r; break; } } System.out.println(tmp); } }
  • 相关阅读:
    HDU-1875-畅通工程再续(最小生成树)
    HDU-1325-Is It A Tree?(并查集+有向树)
    HDU-2473-Junk-Mail Filter(并查集删除)
    HDU-1233-还是畅通工程(最小生成树)
    POJ-2492-A Bug's Life(并查集分类)
    asp.net core 中KindEditor的使用
    使用FormsAuthenticationTicket进行登陆验证
    c#生成随机字符串
    string.Format对C#字符串格式化
    在Ubuntu上使用noip动态域名的方法(ddns)
  • 原文地址:https://www.cnblogs.com/dengyt/p/7039533.html
Copyright © 2020-2023  润新知