Python程序:查找火箭碰撞后的最终状态


假设我们有一个名为nums的数字列表,它表示火箭的大小和方向。正整数表示向右,负数表示向左。数字的绝对值表示火箭的大小。现在,当两枚火箭碰撞时,较小的火箭会被摧毁,较大的火箭将继续其旅程而不受影响。当两枚火箭大小相同时且发生碰撞时,它们都会被摧毁。当两枚火箭朝同一方向移动时,它们永远不会碰撞(假设火箭速度相同)。我们必须找到所有碰撞后火箭的状态。

因此,如果输入类似于nums = [3, 8, 5, -5],则输出将为[3, 8],因为5和-5将被摧毁,其余将存活。

为了解决这个问题,我们将遵循以下步骤:

  • ls := 一个包含nums[0]作为唯一元素的新列表
  • 对于从1到nums大小-1的范围内的i,执行以下操作:
    • 如果nums[i] >= 0,则
      • 将nums[i]插入到ls的末尾
    • 否则,
      • 将nums[i]插入到ls的末尾
      • j := ls的大小-2
      • 当j >= 0且ls[j] >= 0时,执行以下操作:
        • 如果|ls的最后一个元素| > ls[j],则
          • 从ls中删除第j个元素
        • 否则,当|ls的最后一个元素|与ls[j]相同时,则
          • 从ls中删除第j个元素
          • 从ls中删除最后一个元素
          • 退出循环
        • 否则,
          • 从ls中删除-最后一个元素
          • 退出循环
        • j := j - 1
  • 返回ls

让我们看看以下实现以获得更好的理解:

示例

实时演示

class Solution:
   def solve(self, nums):
      ls = [nums[0]]
      for i in range(1, len(nums)):
         if nums[i] >= 0:
            ls.append(nums[i])
         else:
            ls.append(nums[i])
            j = len(ls) - 2
            while j >= 0 and ls[j] >= 0:
               if abs(ls[-1]) > ls[j]:
                  ls.pop(j)
               elif abs(ls[-1]) == ls[j]:
                  ls.pop(j)
                  ls.pop(-1)
                  break
               else:
                  ls.pop(-1)
                  break
               j -= 1
      return ls

ob = Solution()
nums = [3, 8, 5, -5]
print(ob.solve(nums))

输入

[3, 8, 5, -5]

输出

[3, 8]

更新于: 2020年12月2日

122 次浏览

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告