某找房网 笔试题(一)

一、题目描述: 

给你一个合法的算术表达式,只包含整数和加号,减号。但整数不一定都是十进制的数,可能是八进制,十六进制,规定包含前缀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;		
	}

}

六、说明:

该代码并没有进行完善的测试,如果有什么问题,欢迎大家批评指正!共同进步! 

猜你喜欢

转载自blog.csdn.net/fhy569039351/article/details/83113615
今日推荐