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