常見Java問題及筆試題(十七)——阿里2017實習生研發題

師太,老衲把持不住了發表於2017-04-28

題目:一個對於一個單行的逆波蘭表示式,由如下元素構成:

數字:十進位制數字字元構成的正整數,比如 223

運算子:支援三種運算子^+和*,分別代表自增,加法和乘法

分隔符:一個或者多個空格

例如下面的字串就是個逆波蘭表示式

2 3 4 * ^ 5 +

逆波蘭表示式在一個基於棧的虛擬機器中求解,虛擬機器的棧能儲存16個整數,虛擬機器從左向右掃描表示式,遇到整數就壓棧,遇到表示式則從棧頂彈出若干個整數進行計算,計算結果重新壓回棧中。其中運算子^從棧頂彈出一個整數,增加1之後壓棧;運算子+和*從棧頂彈出兩個整數,分別做相加和相乘運算後壓棧。如果遇到運算子的時候,棧內沒有足夠的整數,稱為下溢位,返回-1;把整數壓棧的時候,如果棧沒有足夠的空間,稱為上溢位,返回-2;如果整個計算過程中沒有發生溢位,在整個表示式求解完成後,返回棧頂的整數。

分析:其實這題,之前我是寫過的,LeetCode上面有這道題,但是當時沒有異常處理,還是小編機智,發現了這個點,一開始,我在本地測試都是對的,但是不知道為什麼每次線上測試都是通過率都是0,後來才發現沒有處理異常。好了程式碼如下:

import java.util.ArrayDeque;

import java.util.ArrayList;

import java.util.Scanner;

public class Main {

public static void main(String[] args) {

ArrayList<Integer> inputs = new ArrayList<Integer>();

Scanner in = new Scanner(System.in);

String line = in.nextLine();

if (line != null && !line.isEmpty()) {

int res = resolve(line.trim());

System.out.println(String.valueOf(res));

}

}

public static int resolve(String expr) {

ArrayDeque<Integer> stack = new ArrayDeque<>();

String[] str = expr.split(" ");

if (str.length > 16) {

return -2;

}

for (int i = 0; i < str.length; i++) {

if (str[i].matches("\\d+$")) {

stack.push(Integer.parseInt(str[i]));

if (stack.size() > 16) {

return -2;

}

} else {

String temp = str[i];

switch (temp) {

case "^":

try {

int i1 = (int) stack.pop() + 1;

stack.push((Integer) i1);

break;

} catch (Exception e) {

return -1;

}

case "+":

try {

int right = stack.pop();

int left = stack.pop();

stack.push(right + left);

break;

} catch (Exception e) {

return -1;

}

case "*":

try {

int right1 = stack.pop();

int left1 = stack.pop();

stack.push(right1 * left1);

break;

} catch (Exception e) {

return -1;

}

}

}

}

return stack.pop();

}

}

程式碼已通過線上測試!只是個人覺得程式碼好像不是很漂亮!

最後小編依然歡迎大家評論!小編會在第一時間回覆,如果喜歡的話,歡迎訂閱哦!一起交流學習進步,畢竟頭條的讀者中程式設計大神大有人在啊!

相關文章