Giả sử chúng ta có một danh sách các số được gọi là nums và đó là đại diện cho kích thước và hướng của tên lửa. Số nguyên dương biểu thị bên phải và số âm biểu thị bên trái. Và giá trị tuyệt đối của con số thể hiện kích thước của tên lửa. Bây giờ khi hai tên lửa va chạm, tên lửa nhỏ hơn sẽ bị phá hủy và tên lửa lớn hơn sẽ tiếp tục hành trình của nó không thay đổi. Khi chúng có cùng kích thước tên lửa và chúng va chạm, cả hai sẽ phá hủy. Khi hai tên lửa chuyển động cùng chiều, chúng sẽ không bao giờ va chạm (giả sử tốc độ các tên lửa là như nhau). Chúng tôi phải tìm trạng thái của tên lửa sau tất cả các vụ va chạm.
Vì vậy, nếu đầu vào giống như nums =[3, 8, 5, -5], thì đầu ra sẽ là [3, 8], vì 5 và -5 sẽ bị hủy, phần còn lại sẽ tồn tại.
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
- ls:=một danh sách mới với một nums phần tử [0]
- đối với tôi trong phạm vi từ 1 đến kích thước là nums - 1, thực hiện
- nếu nums [i]> =0, thì
- chèn nums [i] vào cuối ls
- nếu không,
- chèn nums [i] vào cuối ls
- j:=kích thước của ls - 2
- while j> =0 and ls [j]> =0, do
- if | phần tử cuối cùng của ls |> ls [j], sau đó
- xóa phần tử thứ j khỏi ls
- ngược lại khi | phần tử cuối cùng của ls | giống như ls [j], thì
- xóa phần tử thứ j khỏi ls
- xóa phần tử cuối cùng khỏi ls
- ra khỏi vòng lặp
- nếu không,
- xóa phần tử cuối cùng khỏi ls
- ra khỏi vòng lặp
- j:=j - 1
- if | phần tử cuối cùng của ls |> ls [j], sau đó
- nếu nums [i]> =0, thì
- trả về ls
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
Ví dụ
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))
Đầu vào
[3, 8, 5, -5]
Đầu ra
[3, 8]