Cho danh sách và số bước quay n, dịch chuyển các phần tử sang phải n vị trí. Phần tử bị đẩy ra cuối sẽ quay về đầu.
Ví dụ
Input: A = [2, 4, 5, 12, 90], n = 3
Output: [12, 90, 2, 4, 5] # hoặc [90, 12, 2, 4, 5] tùy định nghĩa
Phương pháp 1: Vòng lặp
def right_rotation(my_list, num):
output_list = []
# Lấy n phần tử cuối
for item in range(len(my_list) - num, len(my_list)):
output_list.append(my_list[item])
# Lấy phần còn lại
for item in range(0, len(my_list) - num):
output_list.append(my_list[item])
return output_list
Phương pháp 2: Slicing (khuyên dùng)
def right_rotate_slice(lst, n):
n = n % len(lst) # xử lý n > len(lst)
return lst[-n:] + lst[:-n]
# Test
A = [11, 22, 33, 44, 55, 66]
print(right_rotate_slice(A, 3)) # [44, 55, 66, 11, 22, 33]
Phương pháp 3: Slicing ngắn gọn
A = [11, 22, 33, 44, 55, 66]
n = 3
A = A[-n:] + A[:-n]
print(A) # [44, 55, 66, 11, 22, 33]
So sánh
| Phương pháp | Độ phức tạp | Độ đọc | Ghi chú |
|---|---|---|---|
| Vòng lặp | O(n) | Thấp | Dễ hiểu cho người mới |
| Slicing | O(n) | Cao | Pythonic, ngắn gọn, hiệu quả |
Quay trái (left rotate)
def left_rotate(lst, n):
n = n % len(lst)
return lst[n:] + lst[:n]