题目描述
一个荒岛上有若干人,岛上只有一条路通往岛屿两端的港口,大家需要逃往两端的港口才可逃生。
假定每个人移动的速度一样,且只可选择向左或向右逃生。
若两个人相遇,则进行决斗,战斗力强的能够活下来,并损失掉与对方相同的战斗力;若战斗力相同,则两人同归于尽。
输入描述
给定一行非 0 整数数组,元素个数不超过30000;
正负表示逃生方向(正表示向右逃生,负表示向左逃生),绝对值表示战斗力,越左边的数字表示里左边港口越近,逃生方向相同的人永远不会发生决斗。
输出描述
能够逃生的人总数,没有人逃生输出0,输入异常时输出-1。
用例1
输入
5 10 8 -8 -5
输出
2
说明
第3个人和第4个人同归于尽,第2个人杀死第5个人并剩余5战斗力,第1个人没有遇到敌人。
import java.util.Scanner;
import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
static boolean negative = false;
static Stack<Integer> stack = new Stack<Integer>();
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int[] nums = Arrays.stream(in.nextLine().split(" ")).mapToInt(
Integer::parseInt).toArray();
for (int num : nums) {
dealNum(num);
}
System.out.print(stack.size());
}
static void dealNum(int num) {
if (stack.size() == 0) {
stack.push(num);
if (num < 0) {
negative = true;
}
} else {
if ((num > 0 && !negative) || (num < 0 && negative)) {
stack.push(num);
} else {
int value = stack.pop();
int store = value + num;
if ((store < 0 && !negative) || (store > 0 && negative)) {
dealNum(store);
} else if ((store > 0 && !negative) || (store < 0 && negative)) {
stack.push(store);
}
}
}
}
}