面试算法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();}
}
相关文章:
面试算法37:小行星碰撞
题目 输入一个表示小行星的数组,数组中每个数字的绝对值表示小行星的大小,数字的正负号表示小行星运动的方向,正号表示向右飞行,负号表示向左飞行。如果两颗小行星相撞,那么体积较小的小行星将会爆炸最终消失…...
ROS学习记录2018.7.10
ROS学习记录2018.7.10 1.ROS基础了解 开源机器人操作系统ROS(robot operation system) 分级: 1.计算图集(一种网络结构) 1.节点:执行运算的进程(做基础处理的单元)2.消息&#x…...
OPC UA:工业领域的“HTML”
OPC UA是工业自动化领域的一项重要的通信协议。它的特点是包括了信息模型构建方法。能够建立工业领域各种事物的信息模型。在工业自动化行业,OPCUA 类似互联网行业的HTTP协议和“HTML”语言。能够准确,可靠地描述复杂系统中各个元素,并且实现…...
【golang】Windows环境下Gin框架安装和配置
Windows环境下Gin框架安装和配置 我终于搞定了Gin框架的安装,花了两三个小时,只能说道阻且长,所以写下这篇记录文章 先需要修改一些变量,这就需要打开终端,为了一次奏效,我们直接设置全局的: …...
多测师肖sir_高级金牌讲师__接口测试之tonken (5.6)
接口测试之tonken 网站:http://shop.duoceshi.com/login?redirect2Fdashboard 第一个接口:uiid接口 uiid接口url:http://manage.duoceshi.com/auth/code test中语句: var jsonData JSON.parse(responseBody); postman.setEnvi…...
C++常见面试问题之内存对齐
一、内存对齐是什么 1.内存对齐是什么 还是用一个例子带出这个问题,看下面的小程序,理论上,32位系统下,int占4byte,char占一个byte,那么将它们放到一个结构体中应该占415byte;但是实际上&…...
网络协议--TCP:传输控制协议
17.1 引言 本章将介绍TCP为应用层提供的服务,以及TCP首部中的各个字段。随后的几章我们在了解TCP的工作过程中将对这些字段作详细介绍。 对TCP的介绍将由本章开始,并一直包括随后的7章。第18章描述如何建立和终止一个TCP连接,第19和第20章将…...
网络协议--BOOTP:引导程序协议
16.1 引言 在第5章我们介绍了一个无盘系统,它在不知道自身IP地址的情况下,在进行系统引导时能够通过RARP来获取它的IP地址。然而使用RARP有两个问题:(1)IP地址是返回的唯一结果;(2)…...
33基于MATLAB的对RGB图像实现中值滤波,均值滤波,维纳滤波。程序已通过调试,可直接运行。
基于MATLAB的对RGB图像实现中值滤波,均值滤波,维纳滤波。程序已通过调试,可直接运行。 33 MATLAB、图像处理、维纳滤波 (xiaohongshu.com)...
WPF十六(页面内嵌加载)
在WPF中进行页面内嵌的加载 当存在一定需求时,比如当前页面C左侧是一个A页面,右侧是一个B页面,A页面是一个公用页面时,此时只需要做内嵌A页面,然后B页面进行正常处理,既可以节省时间,又做到了WP…...
JAVA基础(JAVA SE)学习笔记(九)异常处理
前言 1. 学习视频: 尚硅谷Java零基础全套视频教程(宋红康2023版,java入门自学必备)_哔哩哔哩_bilibili 2023最新Java学习路线 - 哔哩哔哩 第三阶段:Java高级应用 9.异常处理 10.多线程 11.常用类和基础API 12.集合框架 13.泛型 14…...
Miniconda、Vscode下载和conda源、pip源设置
1、常用软件下载 1、Miniconda软件下载: windows网址:https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/?CS&OA 2、最新版Miniconda下载网址:https://docs.conda.io/projects/miniconda/en/latest/ 3、常用代码编辑器VsCode下…...
CAN接口的PCB Layout规则要求汇总
随着时代高速发展,控制器局域网(CAN)接口的应用越来越广泛,尤其是在汽车电子、航空航天等领域中发挥着重要作用,为了确保CAN接口的可靠性和稳定性,工程师必须在其PCB Layout方面下功夫,下面来看…...
IP网络矿用打点紧急广播方案
IP网络矿用打点紧急广播方案 一、概述 目前,随着计算机网络技术的迅速普及,信息化已经走向煤矿。很多煤矿都陆续具有了稳定可靠、覆盖矿井上下的工业以太网。科学技术的不断进步和信息化矿山建设步伐的不断加快,井下工业以太网将逐渐得到推…...
系列六、FactoryBean vs ApplicationContext
一、FactoryBean vs ApplicationContext 1.1、概述 BeanFactory是一个工厂类,负责生产和管理bean,在Spring中BeanFactory是IOC容器的核心接口,它的主要职责就是生产bean及建立各个bean之间的依赖。applicationContext是BeanFactory的一个子接…...
AOP简单使用模版
AOP面向切面编程 切面类的定义之模版 package com.xie.service;import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.*; import org.aspectj.lang.ProceedingJoinPoint; import org.springframework.stereotype.Component; import javax.servlet.http.Http…...
手机注册.
<!DOCTYPE html> <html><head><title>注册</title><meta http-equiv"content-type" content"text/html; charsetutf-8"/><meta name"apple-mobile-web-app-capable" content"yes"/><lin…...
PostgreSQL 17新特性之登录事件触发器
PostgreSQL 9.3 就提供了事件触发器功能,可以基于 DDL 语句触发相应的操作。 正在开发中的 PostgreSQL 17 增加了基于登录事件的触发器,可以在用户登录时执行某些检查或者特定操作。登录事件触发器的使用方法和其他触发器一样:创建一个返回 …...
Docker 搭建 LNMP + Wordpress
[TOC](Docker 搭建 LNMP Wordpress 一、项目介绍1.1、项目环境1.2、 服务器环境1.3、 任务需求 二、部署Nginx2.1、建立工作目录2.2、 编写 Dockerfile 脚本2.3、准备 nginx.conf 配置文件2.4、生成镜像2.5、创建自定义网络 三、部署Mysql3.1、建立工作目录3.2、编写 Dockerfi…...
大数据调度最佳实践 | 从Airflow迁移到Apache DolphinScheduler
迁移背景 有部分用户原来是使用 Airflow 作为调度系统的,但是由于 Airflow 只能通过代码来定义工作流,并且没有对资源、项目的粒度划分,导致在部分需要较强权限控制的场景下不能很好的贴合客户需求,所以部分用户需要将调度系统从…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...
使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...
C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
