1、题目描述
有一个荒岛,只有左右两个港口,只有一座桥连接这两个港口,现在有一群人需要从两个港口逃生,有的人往右逃生,有的往左逃生,如果两个人相遇,则PK,体力值大的能够打赢体力值小的,体力值相同则同归于尽,赢的人才能继续往前逃生,并较少相应地体力。
2、输入描述
一行非0整数,用空格隔开,正数代表向右逃生,负数代表向左逃生。
3、输出描述
最终能够逃生的人数。
用例:
输入
10 20 -20 -5 10
输出
2
温馨提示!!!
华为OD机试考试官方会对考生代码查重。华为od机试因为有题库所以有很大的概率抽到原题。如果碰到了题库中的原题,千万不要直接使用题解中的代码,一定要做些修改,比如代码中的变量名,除此之外,代码的组织结构和逻辑也要进行一些改变,所以在日常的刷题中,要提前编写好属于自己的代码。
4、题解
本题需要借助栈来解答,遍历数组每个数,正数则加入栈中,负数则取其绝对值,循环获取栈中的数字并与当前数字判断,体力值大的能够打赢体力值小的,并较少相应地体力,体力值相同则同归于尽。
代码如下:
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] nums = Arrays.stream(sc.nextLine().split(" "))
.mapToInt(Integer::parseInt).toArray();
Stack<Integer> stack = new Stack<>();
// 存活数
int leftCount = 0;
int leftNum = 0;
for (int i=0; i<nums.length; i++) {
int num = nums[i];
if (num > 0) {
// 正数向右
stack.push(num);
}else {
// 负数向左
leftNum = -num;
while (!stack.isEmpty()) {
// 体力值大的能够打赢体力值小的
if (stack.peek() > leftNum) {
stack.push(stack.pop() - leftNum);
leftNum = 0;
}else {
// 抵消对应的体力
leftNum = leftNum - stack.pop();
}
if (leftNum == 0) {
break;
}
}
// 如果存活,则+1
if (leftNum > 0) {
leftCount++;
}
}
}
System.out.println(stack.size() + leftCount);
}
执行结果如下: