36:后缀表达式
:::info 题目:后缀表达式是一种算术表达式,它的操作符在操作数的后面。输入一个用字符串数组表示的后缀表达式,请输出该后缀表达式的计算结果。假设输入的一定是有效的后缀表达式。例如,后缀表达式[“2”,”1”,”3”,”“,”+”]对应的算术表达式是“2+13”,因此输出它的计算结果5。 :::
// evaluate Reverse Polish Notation
public class evalRPN {
public static int evalRPN(String[] arr) {
Stack<Integer> stack = new Stack<>();
List<String> operators = Arrays.asList("+", "-", "*", "/");
for(String str : arr) {
if(operators.contains(str)) {
// 先pop的元素在operator右侧
int num2 = stack.pop();
// 后pop的元素在operator左侧
int num1 = stack.pop();
int rs = calculate(num1, num2, str);
stack.push(rs);
} else {
stack.push(Integer.parseInt(str));
}
}
return stack.pop();
}
private static int calculate(int num1, int num2, String operator) {
switch(operator) {
case "+":
return num1 + num2;
case "-":
return num1 - num2;
case "*":
return num1 * num2;
case "/":
return num1 / num2;
default:
throw new UnsupportedOperationException();
}
}
public static void main(String[] args) {
String[] arr = {"2", "1", "3", "*", "+"};
System.out.println(evalRPN(arr) == 5);
}
}
37:小行星碰撞
:::info 题目:输入一个表示小行星的数组,数组中每个数字的绝对值表示小行星的大小,数字的正负号表示小行星运动的方向,正号表示向右飞行,负号表示向左飞行。如果两颗小行星相撞,那么体积较小的小行星将会爆炸最终消失,体积较大的小行星不受影响。如果相撞的两颗小行星大小相同,那么它们都会爆炸消失。飞行方向相同的小行星永远不会相撞。求最终剩下的小行星。例如,有6颗小行星[4,5,-6,4,8,-5],如图6.2所示(箭头表示飞行的方向),它们相撞之后最终剩下3颗小行星[-6,4,8]。 :::
public class AsteroidCollision() {
public static int[] asteroidCollision(int[] asteroids) {
}
}