当前位置: 面试刷题>> 小行星的碰撞 (经典算法题500道)
### 题目描述补充
题目:**小行星的碰撞**
给定一个整数数组 `asteroids`,其中 `asteroids[i]` 表示第 `i` 颗小行星的位置(位置值越小,小行星越靠近左侧)。小行星以给定的顺序从左向右移动。
当两颗小行星发生碰撞时,体积较小的小行星会被完全摧毁,而体积较大的小行星会保持其原有方向继续移动。如果两颗小行星的体积相同,则它们都会被摧毁。
编写一个函数,该函数接受一个整数数组 `asteroids` 作为输入,并返回碰撞后剩余的小行星的数组。
### 示例
**输入**:`asteroids = [5, 10, -5]`
**输出**:`[5, 10]`
**解释**:第二颗小行星与第三颗小行星发生碰撞,第三颗小行星被摧毁,因此只剩下第一颗和第二颗小行星。
### 示例代码
#### PHP 示例
```php
function asteroidCollision($asteroids) {
$stack = [];
foreach ($asteroids as $asteroid) {
if ($asteroid > 0) {
// 如果是正向小行星,直接入栈
$stack[] = $asteroid;
} else {
// 如果是负向小行星
while (!empty($stack) && end($stack) > 0 && $stack[count($stack) - 1] < abs($asteroid)) {
// 栈顶为正向且小于负向小行星,弹出栈顶
array_pop($stack);
}
if (!empty($stack) && end($stack) == abs($asteroid)) {
// 栈顶为正向且等于负向小行星,两者都弹出
array_pop($stack);
} elseif (!empty($stack) && end($stack) > 0) {
// 栈顶为正向且大于负向小行星,负向小行星被摧毁
continue;
} else {
// 栈为空或栈顶为负向,负向小行星入栈
$stack[] = $asteroid;
}
}
}
return $stack;
}
// 测试用例
$asteroids = [5, 10, -5];
$result = asteroidCollision($asteroids);
print_r($result); // 输出: Array ( [0] => 5 [1] => 10 )
```
#### Python 示例
```python
def asteroidCollision(asteroids):
stack = []
for asteroid in asteroids:
if asteroid > 0:
stack.append(asteroid)
else:
while stack and stack[-1] > 0 and stack[-1] < abs(asteroid):
stack.pop()
if stack and stack[-1] == abs(asteroid):
stack.pop()
elif not stack or (stack and stack[-1] < 0):
stack.append(asteroid)
return stack
# 测试用例
asteroids = [5, 10, -5]
result = asteroidCollision(asteroids)
print(result) # 输出: [5, 10]
```
#### JavaScript 示例
```javascript
function asteroidCollision(asteroids) {
let stack = [];
for (let asteroid of asteroids) {
if (asteroid > 0) {
// 如果是正向小行星,直接入栈
stack.push(asteroid);
} else {
// 如果是负向小行星
while (stack.length > 0 && stack[stack.length - 1] > 0 && stack[stack.length - 1] < Math.abs(asteroid)) {
// 栈顶为正向且小于负向小行星,弹出栈顶
stack.pop();
}
if (stack.length > 0 && stack[stack.length - 1] === Math.abs(asteroid)) {
// 栈顶为正向且等于负向小行星,两者都弹出
stack.pop();
} else if (stack.length > 0 && stack[stack.length - 1] > 0) {
// 栈顶为正向且大于负向小行星,负向小行星被摧毁
continue;
} else {
// 栈为空或栈顶为负向,负向小行星入栈
stack.push(asteroid);
}
}
}
return stack;
}
// 测试用例
let asteroids = [5, 10, -5];
let result = asteroidCollision(asteroids);
console.log(result); // 输出: [5, 10]
```
### 码小课相关内容
码小课网站中涵盖了更多算法和数据结构的深入解析与实战案例,包括但不限于排序算法、搜索算法、图论、动态规划等经典问题,以及更多面试高频题目的详细解答和代码实现,非常适合广大编程爱好者和准备面试的开发者学习。