Chỉ cần tìm thấy một lần lặp
Bài toán hỏi dãy có **ít nhất hai vị trí khác nhau mang cùng một giá trị** hay không. Với từng chỉ số `i`, chỉ cần hỏi `a[i]` đã có trong đoạn đứng trước `a[:i]` chưa. Nếu có, trả `True` ngay; nếu hết dãy vẫn không thấy, trả `False`. Cách này không cần tạo dãy số lần xuất hiện. Ví dụ `[7, 4, 7]` trả `True` ở lần xét số 7 cuối, còn `[7, 4, 9]` trả `False`.
Kiểm phần trước, không tự so với chính mình
```python
def co_gia_tri_lap(a):
for i in range(len(a)):
if a[i] in a[:i]:
return True
return False
print(co_gia_tri_lap([7, 4, 7]))
print(co_gia_tri_lap([7, 4, 9]))
```
Hai kết quả là `True` và `False`. Ở `i = 0`, `a[:0]` rỗng nên chưa có phần tử cũ. Với dãy rỗng hoặc một phần tử, không thể có cặp lặp, hàm trả `False`. Dùng `a[:i]` để lấy phần đứng trước; nếu kiểm `a[i] in a` thì luôn đúng vì chính phần tử đang xét có trong `a`.
Bài luyện
`co_gia_tri_lap([6, 2, 6])` trả gì?
Vị trí 0 và 2 đều mang giá trị 6.
Không yêu cầu đứng kề nhau.
Chỉ cần một giá trị lặp.
Số trùng là dữ liệu hợp lệ.
Lời giải
Khi i=2, a[2]=6 đã nằm trong a[:2]=[6,2], nên hàm trả True.
Bài luyện
Vì sao kiểm `a[i] in a` không giải được bài toán phát hiện lặp?
Điều kiện này tự tính cả chính vị trí i.
in dùng được với danh sách.
Giá trị bất kì đều có thể xét.
a là toàn dãy, không phải phần trước.
Lời giải
Muốn tìm một lần xuất hiện khác, cần loại chính vị trí đang xét; mã dùng a[:i] để chỉ xét các phần tử trước i.
Bài luyện
Với dãy rỗng, hàm `co_gia_tri_lap` trả gì?
Không có hai vị trí để lặp.
Vòng for không chạy và đến return False.
Hàm trả giá trị logic.
Không có thao tác lấy a[i].
Lời giải
Dãy rỗng không có cặp vị trí khác nhau, nên không có giá trị lặp.
Đang học