行星碰撞取剩余元素
给定一个整数数组 asteroids,表示在同一行的行星。
对于数组中的每一个元素,其绝对值表示行星的大小,正负表示行星的移动方向(正表示向右移动,负表示向左移动)。每一颗行星以相同的速度移动。
找出碰撞后剩下的所有行星。碰撞规则:两个行星相互碰撞,较小的行星会爆炸。如果两颗行星大小相同,则两颗行星都会爆炸。两颗移动方向相同的行星,永远不会发生碰撞。
示例一:
输入:asteroids = [5,10,-5]
输出:[5,10]
解释:10 和 -5 碰撞后只剩下 10 。 5 和 10 永远不会发生碰撞
示例二:
输入:asteroids = [8,-8]
输出 :[]
解释:8 和 -8 碰撞后,两者都发生爆炸。
题解:
function asteroidCollision($asteroids) {
$length = count($asteroids);
if ($length === 0) {
return [];
}
if ($length === 1) {
return $asteroids;
}
$stack = [];
array_push($stack, $asteroids[0]);
for ($i = 1; $i < $length; $i++) {
$left_star = array_pop($stack) ?? 0;
$right_star = $asteroids[$i];
//右星和左星方向不一致才会发生碰撞,是直线型,但不是环形
while($left_star > 0 && $right_star < 0){
if (abs($right_star) > $left_star) { // 右星大,继续取出左星
$left_star = array_pop($stack) ?? 0;
} elseif (abs($right_star) < $left_star) { // 右星小,右星碰撞消失归零
$right_star = 0;
} else { // 左右星一致,双星归零
$right_star = 0;
$left_star = 0;
}
}
if ($left_star !== 0) {
array_push($stack, $left_star);
}
if ($right_star !== 0) {
array_push($stack, $right_star);
}
}
return $stack;
}
特例:
[-2,-1,1,2] 中情况下,左星和右星永远不会发生碰撞,直线型,非环形。
龙卷风之殇
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
2022-03-02 安装pyecharts报错--cannot import name 'Scatter' from 'pyecharts