让我们逐行分解代码。
int checker = 0; 我们初始化了一个checker,它将帮助我们找到重复的值。
int val = str.charAt(i) - 'a'; 我们正在获取字符串中“i”位置处字符的ASCII值,并将其与“a”的ASCII值相减。由于假设该字符串仅包含小写字母,因此字符数限制为26个。因此,“val”的值始终为≥0。
if ((checker & (1 << val)) > 0) return false;
checker |= (1 << val);
现在是棘手的部分。让我们以字符串“abcda”为例。这应该理想地返回false。
for循环迭代1:
Checker:00000000000000000000000000000000
val:97-97=0
1 << 0:00000000000000000000000000000001
checker & (1 << val):00000000000000000000000000000000不大于0
因此checker:00000000000000000000000000000001
for循环迭代2:
Checker:00000000000000000000000000000001
val:98-97=1
1 << 1:00000000000000000000000000000010
checker & (1 << val):00000000000000000000000000000000不大于0
因此checker:00000000000000000000000000000011
for循环迭代3:
Checker:00000000000000000000000000000011
val:99-97=2
1 << 2:00000000000000000000000000000100
checker & (1 << val):00000000000000000000000000000000不大于0
因此checker:00000000000000000000000000000111
for循环迭代4:
Checker:00000000000000000000000000000111
val:100-97=3
1 << 3:00000000000000000000000000001000
检查器& (1 << val) :00000000000000000000000000000000 不大于 0
因此,检查器:00000000000000000000000000001111
For循环迭代5:
检查器:00000000000000000000000000001111
val:97-97 = 0
1 << 0: 00000000000000000000000000000001
检查器 & (1 << val) :00000000000000000000000000000001 大于 0
因此返回false。