Hãy chia nhỏ dòng mã theo từng dòng.
kiểm tra int = 0; Chúng tôi đang bắt đầu một trình kiểm tra sẽ giúp chúng tôi tìm thấy các giá trị trùng lặp.
int val = str.charAt (i) - 'a'; Chúng tôi đang nhận giá trị ASCII của ký tự ở vị trí 'thứ i của chuỗi và trừ nó với giá trị ASCII là' a '. Vì giả định là chuỗi chỉ có các ký tự thấp hơn, số lượng ký tự được giới hạn ở 26. Hece, giá trị của 'val' sẽ luôn là> = 0.
if ((kiểm tra & (1 << val))> 0) trả về false;
kiểm tra | = (1 << val);
Bây giờ đây là phần khó khăn. Cho phép chúng tôi xem xét một ví dụ với chuỗi "abcda". Điều này lý tưởng nên trả lại sai.
Đối với vòng lặp 1:
Người kiểm tra: 0000000000000000000000000000000000
val: 97-97 = 0
1 << 0: 0000000000000000000000000000000101
người kiểm tra & (1 << val): 0000000000000000000000000000000000 không> 0
Do đó kiểm tra: 00000000000000000000000000000001
Đối với vòng lặp 2:
Người kiểm tra: 00000000000000000000000000000001
val: 98-97 = 1
1 << 0: 00000000000000000000000000000010
người kiểm tra & (1 << val): 0000000000000000000000000000000000 không> 0
Do đó kiểm tra: 00000000000000000000000000000011
Đối với vòng lặp 3:
Người kiểm tra: 00000000000000000000000000000011
val: 99-97 = 0
1 << 0: 00000000000000000000000000000100
người kiểm tra & (1 << val): 0000000000000000000000000000000000 không> 0
Do đó kiểm tra: 00000000000000000000000000000111
Đối với vòng lặp 4:
Người kiểm tra: 00000000000000000000000000000111
val: 100-97 = 0
1 << 0: 00000000000000000000000000001000
người kiểm tra & (1 << val): 0000000000000000000000000000000000 không> 0
Do đó kiểm tra: 00000000000000000000000000001111
Đối với vòng lặp 5:
Người kiểm tra: 00000000000000000000000000001111
val: 97-97 = 0
1 << 0: 0000000000000000000000000000000101
người kiểm tra & (1 << val): 0000000000000000000000000000000101 là> 0
Do đó trả về sai.