Lassen Sie uns den Code Zeile für Zeile aufschlüsseln.
int checker = 0; Wir initiieren einen Checker, der uns hilft, doppelte Werte zu finden.
int val = str.charAt (i) - 'a'; Wir erhalten den ASCII-Wert des Zeichens an der i-ten Position der Zeichenfolge und subtrahieren ihn mit dem ASCII-Wert von 'a'. Da davon ausgegangen wird, dass die Zeichenfolge nur aus niedrigeren Zeichen besteht, ist die Anzahl der Zeichen auf 26 begrenzt. Hece, der Wert von 'val' ist immer> = 0.
if ((checker & (1 << val))> 0) gibt false zurück;
checker | = (1 << val);
Das ist der schwierige Teil. Betrachten wir ein Beispiel mit der Zeichenfolge "abcda". Dies sollte idealerweise false zurückgeben.
Für Schleifeniteration 1:
Prüfer: 00000000000000000000000000000000
val: 97-97 = 0
1 << 0: 00000000000000000000000000000001
checker & (1 << val): 0000000000000000000000000000000000 ist nicht> 0
Daher Prüfer: 0000000000000000000000000000000001
Für Schleifeniteration 2:
Prüfer: 00000000000000000000000000000001
val: 98-97 = 1
1 << 0: 00000000000000000000000000000010
checker & (1 << val): 0000000000000000000000000000000000 ist nicht> 0
Daher Prüfer: 00000000000000000000000000000011
Für Schleifeniteration 3:
Prüfer: 00000000000000000000000000000011
val: 99-97 = 0
1 << 0: 0000000000000000000000000000000100
checker & (1 << val): 0000000000000000000000000000000000 ist nicht> 0
Daher Prüfer: 00000000000000000000000000000111
Für die Schleifeniteration 4:
Prüfer: 00000000000000000000000000000111
val: 100-97 = 0
1 << 0: 0000000000000000000000000000001000
checker & (1 << val): 0000000000000000000000000000000000 ist nicht> 0
Daher Prüfer: 00000000000000000000000000001111
Für die Schleifeniteration 5:
Prüfer: 00000000000000000000000000001111
val: 97-97 = 0
1 << 0: 00000000000000000000000000000001
checker & (1 << val): 00000000000000000000000000000001 ist> 0
Geben Sie daher false zurück.