《剑指offer》面试题37:小行星相撞

题目:输入一个表示小行星的数组,数组中的每个数字的绝对值表示小行星的大小,数字的正负号表示小行星的运动方向,正号表示向右飞行,负号表示向左飞行。
如果两颗小行星相撞,那么体积小的小行星将会爆炸消失,体积大的小行星不受影响。如果相撞的两颗小行星大小相同,则它们会同时爆炸消失。
飞行方向相同的小行星永远不会相撞,求最终剩下的小行星。
例如:有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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值