735 行星碰撞 python3

2021-09-27 04:45:15 字數 4646 閱讀 1201

給定乙個整數陣列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,表示在同一行的行星。對於陣列中的每乙個元素,其絕對值表示行星的大小,正負表示行星的移動方向 正表示向右移動,負表示向左移動 每一顆行星以相同的速度移動。找出碰撞後剩下的所有行星。碰撞規則 兩個行星相互碰撞,較小的行星會 如果兩顆行星大小相同,則兩顆行星都會 兩顆...