某找房網 筆試題(一)

一、題目描述: 

給你一個合法的算術表達式,只包含整數和加號,減號。但整數不一定都是十進制的數,可能是八進制,十六進制,規定包含前綴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;		
	}

}

六、說明:

該代碼並沒有進行完善的測試,如果有什麼問題,歡迎大家批評指正!共同進步! 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章