让我们逐行分解代码。
整数检查器 = 0; 我们正在启动一个检查器,它将帮助我们找到重复值。
int val = str.charAt(i) - 'a'; 我们在字符串的第 i 个位置获取字符的 ASCII 值,然后用 'a' 的 ASCII 值减去它。由于假设字符串仅为低位字符,因此字符数限制为 26。因此,'val' 的值将始终 >= 0。
if ((checker & (1 << val)) > 0) 返回 false;
检查器 |= (1 << val);
现在这是棘手的部分。让我们考虑一个带有字符串“abcda”的示例。理想情况下,这应该返回 false。
对于循环迭代 1:
检查器:000000000000000000000000000000000
值:97-97 = 0
1 << 0: 00000000000000000000000000000001
检查器 & (1 << val): 00000000000000000000000000000000 不是 > 0
因此检查器:000000000000000000000000000000001
对于循环迭代 2:
检查器:00000000000000000000000000000001
值:98-97 = 1
1 << 1: 00000000000000000000000000000010
检查器 & (1 << val): 00000000000000000000000000000000 不是 > 0
因此检查器:00000000000000000000000000000011
对于循环迭代 3:
检查器:00000000000000000000000000000011
值:99-97 = 2
1 << 2: 00000000000000000000000000000100
检查器 & (1 << val): 00000000000000000000000000000000 不是 > 0
因此检查器:00000000000000000000000000000111
对于循环迭代 4:
检查器:00000000000000000000000000000111
值:100-97 = 3
1 << 3: 00000000000000000000000000001000
检查器 & (1 << val): 00000000000000000000000000000000 不是 > 0
因此检查器:00000000000000000000000000001111
对于循环迭代 5:
检查器:000000000000000000000000000001111
值:97-97 = 0
1 << 0: 00000000000000000000000000000001
检查器 & (1 << val): 00000000000000000000000000000001 > 0
因此返回false。