1. 程式人生 > >網易2017春招筆試真題編程題集合(8)——奇怪的表達式求值

網易2017春招筆試真題編程題集合(8)——奇怪的表達式求值

next ann new switch 運算 ase 自己 lin pri

常規的表達式求值,我們都會根據計算的優先級來計算。比如*/的優先級就高於+-。但是小易所生活的世界的表達式規則很簡單,從左往右依次計算即可,而且小易所在的世界沒有除法,意味著表達式中沒有/,只有(+, - 和 *)。現在給出一個表達式,需要你幫忙計算出小易所在的世界這個表達式的值為多少

輸入描述:
輸入為一行字符串,即一個表達式。其中運算符只有-,+,*。參與計算的數字只有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)——奇怪的表達式求值