Mari kita memecah baris kode demi baris.
pemeriksa int = 0; Kami sedang memulai pemeriksa yang akan membantu kami menemukan nilai duplikat.
int val = str.charAt (i) - 'a'; Kami mendapatkan nilai ASCII dari karakter di posisi ke-i dari string dan mengurangkannya dengan nilai ASCII dari 'a'. Karena asumsi adalah bahwa string adalah karakter yang lebih rendah saja, jumlah karakter dalam dibatasi hingga 26. Hece, nilai 'val' akan selalu>> 0.
if ((checker & (1 << val))> 0) return false;
checker | = (1 << val);
Sekarang ini bagian yang sulit. Mari kita perhatikan contoh dengan string "abcda". Ini idealnya akan kembali salah.
Untuk iterasi loop 1:
Pemeriksa: 0000000000000000000000000000000000
val: 97-97 = 0
1 << 0: 00000000000000000000000000000001
pemeriksa & (1 << val): 0000000000000000000000000000000000 tidak> 0
Oleh karena itu pemeriksa: 00000000000000000000000000000001
Untuk iterasi loop 2:
Pemeriksa: 00000000000000000000000000000001
val: 98-97 = 1
1 << 0: 0000000000000000000000000000000010
pemeriksa & (1 << val): 0000000000000000000000000000000000 tidak> 0
Oleh karena itu pemeriksa: 0000000000000000000000000000000011
Untuk iterasi loop 3:
Pemeriksa: 00000000000000000000000000000011
val: 99-97 = 0
1 << 0: 00000000000000000000000000000100100
pemeriksa & (1 << val): 0000000000000000000000000000000000 tidak> 0
Oleh karena itu pemeriksa: 00000000000000000000000000000111
Untuk iterasi loop 4:
Pemeriksa: 00000000000000000000000000000111
val: 100-97 = 0
1 << 0: 00000000000000000000000000001000
pemeriksa & (1 << val): 0000000000000000000000000000000000 tidak> 0
Oleh karena itu pemeriksa: 00000000000000000000000000001111
Untuk iterasi loop 5:
Pemeriksa: 00000000000000000000000000001111
val: 97-97 = 0
1 << 0: 00000000000000000000000000000001
pemeriksa & (1 << val): 0000000000000000000000000000000001 adalah> 0
Karena itu kembalikan salah.