当前位置: 首页 > news >正文

面试算法37:小行星碰撞

题目

输入一个表示小行星的数组,数组中每个数字的绝对值表示小行星的大小,数字的正负号表示小行星运动的方向,正号表示向右飞行,负号表示向左飞行。如果两颗小行星相撞,那么体积较小的小行星将会爆炸最终消失,体积较大的小行星不受影响。如果相撞的两颗小行星大小相同,那么它们都会爆炸消失。飞行方向相同的小行星永远不会相撞。求最终剩下的小行星。例如,有6颗小行星[4,5,-6,4,8,-5],如图6.2所示(箭头表示飞行的方向),它们相撞之后最终剩下3颗小行星[-6,4,8]。
在这里插入图片描述

分析

下面以一个具体的例子来分析小行星碰撞的规律。先假设有6颗小行星[4,5,-6,4,8,-5],然后逐一分析它们的飞行情况。第1颗是向右飞行的大小为4的小行星。此时还不知道它会不会和其他小行星碰撞,可以先将它保存到某个数据容器中。第2颗还是一颗向右飞行的小行星,它的大小为5。它和前面一颗小行星的飞行方向相同,所以不会碰撞。但现在还不知道它会不会和后面的小行星碰撞,因此也将它保存到数据容器中。第3颗是一颗向左飞行的小行星,大小为6。由于它和前面两颗小行星是相向而行的,因此会和前面两颗小行星相撞。由于大小为5的小行星离它更近,因此这两颗小行星将会先相撞。先后向数据容器中保存了大小为4、5的两颗小行星,后保存到数据容器中的小行星先和其他的小行星相撞。

根据题目的碰撞规则,小的小行星将会爆炸消失,因此当大小分别为5和6的两颗小行星相撞时,大小为5的小行星会爆炸消失。大小为6的小行星继续向左飞行,它将和大小为4的小行星相撞。大小为4的小行星爆炸消失,留下大小为6的小行星向左飞行。此时左边已经没有更多的小行星和这颗大小为6的小行星相撞,将它入栈。

接下来是两颗向右飞行的小行星,大小分别为4和8,它们和大小为6的小行星背向飞行,肯定不会相撞,因此将它们也先后入栈。最后是一颗大小为5向左飞行的小行星。此时栈中保存了3颗小行星[-6,4,8],大小为8的小行星离它最近而且相向飞行,因此它将与大小为8的小行星相撞,然后爆炸消失。最终剩下3颗小行星[-6,4,8]。

public class Test {public static void main(String[] args) {int[] tokens = {4, 5, -6, 4, 8, -5};int[] result = asteroidCollision(tokens);for (int res : result) {System.out.println(res);}}public static int[] asteroidCollision(int[] asteroids) {Stack<Integer> stack = new Stack<>();for (int as : asteroids) {while (!stack.empty() && stack.peek() > 0 && stack.peek() < -as) {// 为什么while循环,是因为as没有被撞碎,接着撞stack.pop();}if (!stack.empty() && stack.peek() > 0 && stack.peek() == -as) {// 为什么没有while循环,是因为as被撞碎了stack.pop();}else if (as > 0 || stack.empty() || stack.peek() < 0) {stack.push(as);}// 如果不符合上述情况,则这里表示as被撞碎了,继续分析下一颗行星}return stack.stream().mapToInt(i -> i).toArray();}
}
http://www.lryc.cn/news/207770.html

相关文章:

  • ROS学习记录2018.7.10
  • OPC UA:工业领域的“HTML”
  • 【golang】Windows环境下Gin框架安装和配置
  • 多测师肖sir_高级金牌讲师__接口测试之tonken (5.6)
  • C++常见面试问题之内存对齐
  • 网络协议--TCP:传输控制协议
  • 网络协议--BOOTP:引导程序协议
  • 33基于MATLAB的对RGB图像实现中值滤波,均值滤波,维纳滤波。程序已通过调试,可直接运行。
  • WPF十六(页面内嵌加载)
  • JAVA基础(JAVA SE)学习笔记(九)异常处理
  • Miniconda、Vscode下载和conda源、pip源设置
  • CAN接口的PCB Layout规则要求汇总
  • IP网络矿用打点紧急广播方案
  • 系列六、FactoryBean vs ApplicationContext
  • AOP简单使用模版
  • 手机注册.
  • PostgreSQL 17新特性之登录事件触发器
  • Docker 搭建 LNMP + Wordpress
  • 大数据调度最佳实践 | 从Airflow迁移到Apache DolphinScheduler
  • node实战——搭建带swagger接口文档的后端koa项目(node后端就业储备知识)
  • Qt篇——子控件QLayoutItem与实际控件的强转
  • Css3使用
  • 【嵌入式开源库】timeslice的使用,完全解耦的时间片轮询框架构
  • 人工智能期末考试(刷题篇部分题有答案)
  • 手写Vue渲染器render函数
  • CGAL+QT
  • GBase8a SSL 配置
  • 数据结构之队列(源代码➕图解➕习题)
  • 社区迭代|ETLCloud社区新增“论坛”啦!
  • ohos的代码同步以及添加自己的代码