题目
有一个荒岛,只有左右两个港口,只有一座桥连接这两个港口,现在有一群人需要从两个港口逃生,有的人往右逃生,有的往左逃生,如果两个人相遇,则PK,体力值大的能够打赢体力值小的,体力值相同则同归干尽,赢的人才能继续往前逃生,并减少相应的体力。
输入描述
一行非0整数,用空格隔开,正数代表向右逃生,负数代表向左逃生
输出描述
最终能够逃生的人数
示例1:
输入
5 10 8 -8 -5
输出
2
说明
8与-8相遇,同归于尽,10遇到-5,打赢并减少5点体力,最终逃生的为5,5,均从右侧港口逃生,输出2
思路
类似leetcode:735. 小行星碰撞
正数代表向右,负数代表向左,必须先正后负才有可能相遇,-1,1这样的先负后正的数据则不会相遇。
直接使用栈模拟,遍历输入的数组nums:
当栈顶元素为正,当前元素为负数时,考虑以下三种情况5 6 7, -4 。当前元素绝对值较小,上一个移出,准备加入当前元素3(7-4),当前元素为正,结束循环
5 6 7,-8。当前元素绝对值较大,上一个移出,准备加入-1(并非真加入,此时依然满足栈顶为正,当前为负的条件,继续循环),结束循环时,栈顶元素为5,准备加入5。
5 6 7,-7,当前元素绝对值和栈顶绝对值相等,准备加入0,当前元素非负,结束循环在上面三种情况中,只有准备加入的元素是0时,不用加入,其他均加入栈顶即可
stack中最后存放的能够逃生的人,返回它的长度就代表成功逃生人数
题解
package hwod;import java.util.Arrays;
import java.util.LinkedList;
import java.util.Scanner;public class DesertIslandSurvival {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int[] nums = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();System.out.println(desertIslandSurvival(nums));}private static int desertIslandSurvival(int[] nums) {LinkedList<Integer> stack = new LinkedList<>();for (int i = 0; i < nums.length; i++) {while (!stack.isEmpty() && stack.peekLast() > 0 && nums[i] < 0) {nums[i] += stack.removeLast();}if(nums[i]!=0) stack.addLast(nums[i]);}return stack.size();}
}
推荐
如果你对本系列的其他题目感兴趣,可以参考华为OD机试真题及题解(JAVA),查看当前专栏更新的所有题目。