1. 程式人生 > >某找房網 筆試題(一)

某找房網 筆試題(一)

一、題目描述: 

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

}

六、說明:

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