1. 华为OD机考题 + 答案
2023华为OD统一考试(A+B卷)题库清单-带答案(持续更新)
2023年华为OD真题机考题库大全-带答案(持续更新)
2. 面试题
一手真实java面试题:2023年各大公司java面试真题汇总--持续更新
3. 技术知识
有一个荒岛,只有左右两个港口,只有一座桥连接这两个港口,现在有一群人需要从两个港口逃生,有的人往右逃生,有的往左逃生,如果两个人相遇,则PK,体力值大的能够打赢体力值小的,体力值相同则同归干尽,赢的人才能继续往前逃生,并减少相应的体力
输入描述
一行非 0 整数,用空格隔开,正数代表向右逃生,负数代表向左逃生
输出描述
最终能够逃生的人数
示例1:
输入
5 10 8 -8 -5
输出
2
说明
8与-8 相遇,同归于尽,10 遇到-5,打赢并减少五点体力,最终逃生的为5,5,均从右侧港口逃生,输出2
public class IslandSurvival {
//5 10 8 -8 -5
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
List<Integer> power = Arrays.stream(sc.nextLine().split(" ")).map(Integer::parseInt).collect(Collectors.toList());
List<Integer> right = new ArrayList<>();
List<Integer> left = new ArrayList<>();
//先将左右方向的人区分
for (int i = 0; i < power.size(); i++){
if (power.get(i) > 0){
right.add(power.get(i));
}else {
left.add(power.get(i));
}
}
int exit = fight(left,right);
System.out.println(exit);
}
public static int fight(List<Integer> l,List<Integer> r){
int exit = 0;
//用个左右双指针
int left = 0;
int right = r.size() - 1;
while (left < l.size() && right >= 0){
//体力绝对值不相等,就会有一方能逃离
//最最左边的跟左右边的人比
if (Math.abs(l.get(left)) != Math.abs(r.get(right))){
exit++;
}
left++;
right--;
}
//左右方向的有剩余的没有参与战斗的人员
exit += (l.size() -1)-(left - 1);
exit += (right + 1);
return exit;
}
}