nums라고 하는 숫자 목록이 있고 로켓의 크기와 방향을 나타내는 목록이 있다고 가정합니다. 양의 정수는 오른쪽을 나타내고 음수는 왼쪽을 나타냅니다. 그리고 숫자의 절대값은 로켓의 크기를 나타냅니다. 이제 두 개의 로켓이 충돌할 때 작은 로켓은 파괴되고 큰 로켓은 변경되지 않고 계속 여행을 계속합니다. 같은 크기의 로켓이 충돌하면 둘 다 파괴됩니다. 두 로켓이 같은 방향으로 움직이면 충돌하지 않습니다(로켓 속도가 같다고 가정). 모든 충돌 후에 로켓의 상태를 찾아야 합니다.
따라서 입력이 nums =[3, 8, 5, -5]와 같으면 출력은 [3, 8]이 되며 5와 -5는 파괴되고 나머지는 살아남습니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
- ls :=하나의 요소가 있는 새 목록 nums[0]
- 범위 1에서 숫자 크기 - 1까지의 i에 대해
- 숫자[i]>=0이면
- ls 끝에 숫자[i] 삽입
- 그렇지 않으면
- ls 끝에 숫자[i] 삽입
- j :=ls - 2의 크기
- j>=0이고 ls[j]>=0인 동안 do
- if |ls의 마지막 요소|> ls[j], 다음
- ls에서 j번째 요소 삭제
- 그렇지 않으면 |ls|의 마지막 요소가 ls[j]와 같으면
- ls에서 j번째 요소 삭제
- ls에서 마지막 요소 삭제
- 루프에서 나오다
- 그렇지 않으면
- ls에서 마지막 요소 삭제
- 루프에서 나오다
- j :=j - 1
- if |ls의 마지막 요소|> ls[j], 다음
- 숫자[i]>=0이면
- 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]