目录
- 专栏导读
- 一、题目描述
- 二、输入描述
- 三、输出描述
- 四、解题思路
- 五、Java算法源码
- 六、效果展示
- 1、输入
- 2、输出
- 3、说明
华为OD机试 2023B卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。
一、题目描述
有一个荒岛,只有左右两个港口,只有一座桥连接这两个港口,现在有一群人需要从两个港口逃生,有的人往右逃生,有的往左逃生,如果两个人相遇,则PK,体力值大的能够打赢体力值小的,体力值相同则同归于尽,赢的人才能继续往前逃生,并较少相应地体力。
二、输入描述
一行非0整数,用空格隔开,正数代表向右逃生,负数代表向左逃生。
三、输出描述
最终能够逃生的人数。
四、解题思路
题意是这样的:
体力值大的能够打赢体力值小的,体力值相同则同归于尽,赢的人才能继续往前逃生,并较少相应地体力。
正数代表向右逃生,负数代表向左逃生。
- 那就将正数加到一个集合里,负数加到一个集合里;
- 然后开始遍历取值;
- 体力值大的能够打赢体力值小的,并较少相应地体力;
- 体力值相同则同归于尽;
- 最后输出正数集合和负数集合的大小之和,最终能够逃生的人数;
五、Java算法源码
package com.guor.od;import java.util.Scanner;
import java.util.*;public class OdTest01 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);// 一行非0整数,用空格隔开int[] nums = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();// 正数Stack<Integer> positiveStack = new Stack<Integer>();// 负数Stack<Integer> negativeStack = new Stack<Integer>();for (int j = 0; j < nums.length; j++) {int num = nums[j];// 正数代表向右逃生if (num > 0) {positiveStack.push(num);// 负数代表向左逃生} else {negativeStack.push(Math.abs(num));}// 看最后能抵消多少while (!positiveStack.empty() && !negativeStack.empty()) {// 体力值大的能够打赢体力值小的if (positiveStack.peek() > negativeStack.peek()) {positiveStack.push(positiveStack.pop() - negativeStack.pop());} else if (positiveStack.peek() < negativeStack.peek()) {negativeStack.push(negativeStack.pop() - positiveStack.pop());} else {// 体力值相同则同归于尽positiveStack.pop();negativeStack.pop();}}}System.out.println(positiveStack.size() + negativeStack.size());}
}
六、效果展示
1、输入
10 20 -20 -5 10
2、输出
2
3、说明
正数集合:10 20 10
负数集合: -20 -5
- 20和-20同归于尽;
- 10和-5,抵消5体力值;
- 最终能够逃生的人数2人。
🏆下一篇:华为OD机试真题 Java 实现【路灯照明问题】【2022Q4 100分】,感谢fly晨发现这个问题,并提供更优质的算法
🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。