給定乙個整數陣列asteroids,表示在同一行的行星。
對於陣列中的每乙個元素,其絕對值表示行星的大小,正負表示行星的移動方向(正表示向右移動,負表示向左移動)。每一顆行星以相同的速度移動。
找出碰撞後剩下的所有行星。碰撞規則:兩個行星相互碰撞,較小的行星會**。如果兩顆行星大小相同,則兩顆行星都會**。兩顆移動方向相同的行星,永遠不會發生碰撞。
示例1:
輸入:asteroids = [5, 10, -5]
輸出:[5, 10]
解釋:10 和 -5 碰撞後只剩下 10。 5 和 10 永遠不會發生碰撞。
示例2:
輸入:asteroids = [8, -8]
輸出:解釋:8 和 -8 碰撞後,兩者都發生**。
示例3:
輸入:asteroids = [10, 2, -5]
輸出:[10]
解釋:2和-5發生碰撞後剩下-5。10和-5發生碰撞後剩下10。
示例4:
輸入:asteroids = [-2, -1, 1, 2]
輸出:[-2, -1, 1, 2]
解釋:-2和-1向左移動,而1和2向右移動。由於移動方向相同的行星不會發生碰撞,所以最終沒有行星發生碰撞。
說明:
陣列asteroids的長度不超過10000。
每一顆行星的大小都是非零整數,範圍是[-1000, 1000]。
# -*- coding: utf-8 -*-
class
solution()
:"""給出行星碰撞問題的答案"""
defis_positive
(self, asteroid)
:"""判斷asteroid是否為正數"""
if asteroid >0:
return
true
return
false
defpositive_asteroid_action
(self, asteroid, results)
:"""
處理asteroid為負數的情況
直接插入到results中,並設定標誌位為true
"""return
true
defnegative_asteroid_action
(self, asteroid, results, last_result_gt_zero)
:"""
處理asteroid為負數的情況
1.若標誌位為false,則將asteroid插入results
2.若標誌位為true,則asteroid和results[-1]比較
2.1 若asteroid絕對值小,則繼續遍歷asteroids
2.2 若絕對值相等,則刪除results[-1]並繼續遍歷asteroids
2.3 若asteroid絕對值大,則刪除results[-1],並繼續和新的results[-1]比較
直到results為空或result[-1]為負
"""ifnot last_result_gt_zero:
while last_result_gt_zero:
if results[-1
]>
-asteroid:
break
elif results[-1
]==-asteroid:
results.pop()if
not results or results[-1
]<0:
last_result_gt_zero =
false
break
else
: results.pop()if
not results or results[-1
]<0:
last_result_gt_zero =
false
return last_result_gt_zero
defasteroidcollision
(self, asteroids)
:"""給出碰撞結果,存在列表results中"""
results =
# 定義標誌位
# true:代表results[-1] > 0
# false:results為空或者results[-1] < 0
last_result_gt_zero =
false
for asteroid in asteroids:
if self.is_positive(asteroid)
: last_result_gt_zero = self.positive_asteroid_action(asteroid,
results)
else
: last_result_gt_zero = self.negative_asteroid_action(asteroid,
results, last_result_gt_zero)
return results
# -*- coding: utf-8 -*-
import unittest
from asteroid_collision import solution
class
testasteroidcollision
(unittest.testcase)
:"""針對solution類的測試"""
defsetup
(self)
:"""建立乙個solution類,供使用的測試方法使用"""
self.my_solution = solution(
)def
test_empty_array
(self)
:"""測試陣列為空的情況"""
asteroids =
expected_results =
results = self.my_solution.asteroidcollision(asteroids)
self.assertlistequal(results, expected_results)
deftest_one_positive
(self)
:"""測試陣列只有乙個正數的情況"""
asteroids =[8
] expected_results =[8
] results = self.my_solution.asteroidcollision(asteroids)
self.assertlistequal(results, expected_results)
deftest_one_negative
(self)
:"""測試陣列只有乙個負數的情況"""
asteroids =[-
8]expected_results =[-
8]results = self.my_solution.asteroidcollision(asteroids)
self.assertlistequal(results, expected_results)
deftest_no_collision
(self)
:"""測試不會發生碰撞的情況"""
asteroids =[-
8,-4
,4,8
] expected_results =[-
8,-4
,4,8
] results = self.my_solution.asteroidcollision(asteroids)
self.assertlistequal(results, expected_results)
deftest_one_collision
(self)
:"""測試對於某個元素,只會有一次碰撞發生"""
asteroids =[2
,6,-
4,8,
-8,6
,-2]
expected_results =[2
,6,6
] results = self.my_solution.asteroidcollision(asteroids)
self.assertlistequal(results, expected_results)
deftest_many_collision
(self)
:"""測試對於某個元素,會有多次碰撞發生"""
asteroids =[12
,8,-
2,-4
,-6,
-10] expected_results =[12
] results = self.my_solution.asteroidcollision(asteroids)
self.assertlistequal(results, expected_results)
unittest.main(
)
735 行星碰撞
給定乙個整數陣列asteroids,表示在同一行的行星。對於陣列中的每乙個元素,其絕對值表示行星的大小,正負表示行星的移動方向 正表示向右移動,負表示向左移動 每一顆行星以相同的速度移動。找出碰撞後剩下的所有行星。碰撞規則 兩個行星相互碰撞,較小的行星會 如果兩顆行星大小相同,則兩顆行星都會 兩顆移...
leetcode 735 行星碰撞
給定乙個整數陣列asteroids,表示在同一行的行星。對於陣列中的每乙個元素,其絕對值表示行星的大小,正負表示行星的移動方向 正表示向右移動,負表示向左移動 每一顆行星以相同的速度移動。找出碰撞後剩下的所有行星。碰撞規則 兩個行星相互碰撞,較小的行星會 如果兩顆行星大小相同,則兩顆行星都會 兩顆移...
leetcode 735 行星碰撞
給定乙個整數陣列 asteroids,表示在同一行的行星。對於陣列中的每乙個元素,其絕對值表示行星的大小,正負表示行星的移動方向 正表示向右移動,負表示向左移動 每一顆行星以相同的速度移動。找出碰撞後剩下的所有行星。碰撞規則 兩個行星相互碰撞,較小的行星會 如果兩顆行星大小相同,則兩顆行星都會 兩顆...