首页 > 代码库 > 网易2017春招笔试真题编程题集合(8)——奇怪的表达式求值

网易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); } }

 

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