题目描述
一个荒岛上有若干人,岛上只有一条路通往岛屿两端的港口,大家需要逃往两端的港口才可逃生。
假定每个人移动的速度一样,且只可选择向左或向右逃生。
若两个人相遇,则进行决斗,战斗力强的能够活下来,并损失掉与对方相同的战斗力;若战斗力相同,则两人同归于尽。
输入描述
给定一行非 0
整数数组,元素个数不超过30000;
正负表示逃生方向(正表示向右逃生,负表示向左逃生),绝对值表示战斗力,越左边的数字表示里左边港口越近,逃生方向相同的人永远不会发生决斗。
输出描述
能够逃生的人总数,没有人逃生输出0,输入异常时输出-1。
示例1
输入
5 10 8 -8 -5
输出
2
说明
第3个人和第4个人同归于尽,第2个人杀死第5个人并剩余5战斗力,第1个人没有遇到敌人。
解题思路
从头开始逐个读取 向右移动的数,遇到向左移动的数,后读取的数需要先和向左移动的数进行战斗,战斗人员是一个先进后出的顺序,考虑使用栈这个结构进行处理
源码 Java
java
public class EscapeIsland {
static Input input ;
static {
input = new Input("5 10 8 -8 -5");
}
public static void main(String[] args) {
Stack<Integer> right = new Stack<>();
Stack<Integer> left = new Stack<>();
String[] split = input.nextLine().split(" ");
for (int i = 0; i < split.length; i++) {
int val = Integer.parseInt(split[i]) ;
if (val == 0) {
System.out.println(-1);
return;
}
if (val > 0) {
right.push(val);
} else {
int power = val;
while (!right.isEmpty() && power < 0) {
int r = right.pop();
power += r;
}
if (power > 0) {
right.push(power);
} else if(power < 0) {
left.push(power);
}
}
}
System.out.println(right.size() + left.size());
}
}