public static boolean uniqueCheck(String s)
{
int checker=0,val=0;
for (int i = 0; i < s.length(); i++) {
val=s.charAt(i)-'a';
if ((checker & (1<< val))>0) return false;
checker |= (1<<val);
}
return true;
}
我想知道该代码将如何忽略Space((并返回true true true for唯一字符。例如:"a b c d"
返回true。但是空间也具有Unicode值,当它遇到2次空间时,它应该返回false。为什么不??
这是因为1 << (' ' - 'a')
是负面的,因此int由bitmask提取:
(checker & (1 << val))
也为负。
将条件更改为
if ((checker & (1<< val)) != 0) return false;
// ^^ Here.
但是:您只有32位用于指示先前检测char
的检测,并且val
的可能值为65536:对于其他字符串,此方法将很快失败。
例如,该方法声称"Aa"
,"R2"
和" @"
(Space,其次是标志(具有重复的字符,这显然是错误的。
由于ASCII CODEPOINT的排列,这只会发生在"a b c d"
工作 - 空间恰好与字符串中的任何其他符号相撞,Modulo 32。
您应该使用replaceAll()
从string
替换所有whitespaces(或您指定的任何其他字符(。