题目:输入一个表示小行星的数组,数组中的每个数字的绝对值表示小行星的大小,数字的正负号表示小行星的运动方向,正号表示向右飞行,负号表示向左飞行。
如果两颗小行星相撞,那么体积小的小行星将会爆炸消失,体积大的小行星不受影响。如果相撞的两颗小行星大小相同,则它们会同时爆炸消失。
飞行方向相同的小行星永远不会相撞,求最终剩下的小行星。
例如:有6颗小行星[4,5,-6,4,8,-5],它们相撞之后最终剩下三颗小行星[-6,4,8].
分析:可定义一个辅助的列表,然后从左往右遍历小行星列表,如果小行星是向右飞行的,则直接加入辅助列表,
如果小行星是向左飞行的,则要与辅助列表里已存在的小行星PK,从辅助列表里的最后一科小行星开始PK。
如果辅助列表里最后一颗小行星是负的,则直接加入辅助列表。如果辅助列表里的最后一颗小行星的正的,则比体积大小,按照规则PK,败者出局。
t = [4,5,-6,4,8,-5]
result = []
def pk(new_ele,list_t):
"""
:param new_ele: 新来的小行星
:param list_t: 辅助列表,里面有已经加入辅助列表的小行星
:return: 返回PK完的辅助列表
"""
# end标记PK是否结束
end = True
# dead标记新来的行星是否死了
dead = False
while end:
if len(list_t) == 0:
end = False
elif list_t[-1] < 0:
end = False
elif list_t[-1] >0 and abs(new_ele) < list_t[-1]:
dead = True
end = False
elif list_t[-1] >0 and abs(new_ele) == list_t[-1]:
end = False
dead = True
list_t.pop()
elif list_t[-1] >0 and abs(new_ele) > list_t[-1]:
list_t.pop()
if dead:
return list_t
else:
list_t.append(new_ele)
return list_t
for i in range(len(t)):
if t[i] < 0 and (result[-1] < 0 or len(result) == 0):
result.append(t[i])
elif t[i] > 0 :
result.append(t[i])
elif t[i] < 0 and result[-1] > 0:
result = pk(t[i],result)
print(result)