我正在练习面试问题示例,其中之一是:"实现算法以确定字符串是否具有所有唯一字符"。
当我们假设这是ASCII/ANSI时,这很容易。实现算法以确定字符串是否具有所有唯一字符
但我的问题是:如果假设字符串可以包含例如象形文字符号或其他任何东西(码位大于 U+FFFF...?),应该如何解决这个问题。
因此,如果我理解正确,我可以很容易地想到解决方案,如果给定的字符串包含属于从 U+0000 到 U+FFFF 的字符集的字符 - 它们可以转换为 16 位字符,但是如果我遇到一个字符的代码点大于 U+FFFF...
?码位大于 U+FFFF 的字符称为增补字符。Java 平台在 char 数组以及 String 和 StringBuffer 类中使用 UTF-16 表示形式。在此表示形式中,增补字符表示为一对字符值,第一个来自高代理项范围 (\uD800-\uDBFF),第二个来自低代理项范围 (\uDC00-\uDFFF)
但是我不知道在这种情况下如何解决这个难题,我如何处理那些代孕对?
谢谢!
8 有一个CharSequence#codePoints
方法,该方法在字符串中生成 Unicode 代码点的IntStream
。 从那里开始,它就变成了编写代码来测试IntStream
中元素的唯一性的问题。
如果您仍在使用 Java 7 或更低版本,那么其中也有基于代码点的方法可用于解决此问题,但它们使用起来要复杂得多。 您必须遍历字符串的char
并检查每个值,以判断您是否正在处理代理项对。 类似的东西(完全未经测试):
for (int i = 0; i < str.length(); i++) {
int codepoint = str.codePointAt(i++);
if (Character.isHighSurrogate(str.charAt(i))) {
// This will fail if the UTF-16 representation of
// this string is wrong (e.g., high surrogate `char`
// at the end of the string's `char[]`).
i += 1;
}
// do stuff with codepoint...
}