某找房網 筆試題(一)
一、題目描述:
給你一個合法的算術表示式,只包含整數和加號,減號。但整數不一定都是十進位制的數,可能是八進位制,十六進位制,規定包含字首0x的是十六進位制,包含字首0的是八進位制,其他情況是十進位制。現在你能計算出這個式子的最終的值嗎?
說明:輸入的表示式式子只會是整數+(-) 整數 +(-) 整數...... + (-)整數
保證給定的整數不會超過16位(保羅字首0或者字首0x)
二、樣例輸入:
輸入有且只有一行,是一個字串,保證是合法的表示式式子
027555+692+0xD32C
三、樣例輸出:
輸出十進位制結果:
-41227
四、問題分析:
1、輸入是一個字串,所以我們首先考慮對字串按符號進行截斷處理:
使用char[] lineChar = line.toCharArray(); 將字串轉換成char型別的陣列;
對陣列進行遍歷,判斷如果不是+/- ,則使用str.append()追加該字元,
如果遇到是+/-,
將符號入符號棧,將str入數字棧,str重新賦值為空;直至陣列遍歷完成!
2、現在我們有兩個棧,一個是數字棧,一個是符號棧。對於數字棧我們需要挨個pop()出並將
8進位制數和16進位制數都轉換成十進位制數,Integer.parseInt(original.pop().substring(2),16)
Integer.parseInt(original.pop().substring(2),8), 並將十進位制數再次入新棧(正式用於計算)
3、現在我們的數字棧裡的數是可以直接參與計算的。我們將數字棧和符號棧裡面的內容按
數字+/-數字+-數字......+/-數字的順序出棧,進行計算,得到最終結果!
五、程式碼實現:(java版本)
package test;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.Stack;
/**
*
* @author FHY
*
* 簡單表示式計算
*/
public class zhaoFangT1 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String line = scan.nextLine();
line = line+"#"; //判斷結尾
char[] lineChar = line.toCharArray();
int result = getCompute(lineChar);
}
private static int getCompute(char[] lineChar) {
Stack<String> original = new Stack<String>();
Stack<Integer> back = new Stack<Integer>();
ArrayList<Character> opeList = new ArrayList<Character>();
StringBuffer eachNum = new StringBuffer() ;
for(int i=0; i<lineChar.length; i++){
if(lineChar[i]=='#'){
System.out.println(eachNum.toString());
original.push(eachNum.toString());
}else if(lineChar[i]!='+' && lineChar[i]!='-'){
eachNum.append(lineChar[i]);
}else{
System.out.println(eachNum.toString());
original.push(eachNum.toString());
opeList.add(lineChar[i]);
eachNum = new StringBuffer();
}
}
while(!original.isEmpty()){
if(original.peek().startsWith("0x")){
back.push(Integer.parseInt(original.pop().substring(2),16));
}else if(original.peek().startsWith("0")){
back.push(Integer.parseInt(original.pop().substring(1),8));
}else{
back.push(Integer.parseInt(original.pop()));
}
}
int sum = back.pop();
int count = 0;
while(!back.isEmpty() && count<opeList.size()){
sum = (Character)opeList.get(count)=='+' ? back.pop()+sum : sum-back.pop();
count++;
}
return sum;
}
}
六、說明:
該程式碼並沒有進行完善的測試,如果有什麼問題,歡迎大家批評指正!共同進步!