当前位置: 首页 > 知识库问答 >
问题:

实现一种算法来确定字符串是否具有所有唯一字符(大于u+ffff的字符)

相野
2023-03-14

我在练习面试问题,其中一个问题是:“实现一个算法来确定字符串是否具有所有唯一的字符”。

但我的问题是:如果我们假设string可以包含象形文字符号或任何东西(代码点大于u+ffff...?),那么该如何解决。

所以,如果我理解的正确,我可以很容易地想到解决方案,如果给定的字符串包含的字符属于从u+0000到u+ffff的字符集--它们可以转换成16位char,但如果我遇到一个字符的代码点大于u+ffff...?

码位大于U+FFFF的字符称为辅助字符。Java平台在char数组以及String和StringBuffer类中使用UTF-16表示。在此表示中,补充字符表示为一对字符值,第一个值来自高替代范围(\ud800-\udbff),第二个值来自低替代范围(\udc00-\udfff)

但我不知道如何解决这个谜题在那种情况下,我如何处理那些代理对?

谢谢!

共有1个答案

法兴德
2023-03-14

Java8有一个charSequence#codepoints方法,它在字符串中生成Unicode代码点的IntStream。从那时起,就变成了编写代码来测试IntStream中元素的唯一性的问题。

如果您还在Java7或更低的版本中,也可以使用基于代码点的方法来解决这个问题,但使用起来要复杂得多。您必须循环访问字符串的chars,并检查每个值,以判断是否在处理代理项对。类似于(完全未经测试的):

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...
}
 类似资料:
  • 问题内容: 上下文:我是CS n00b,正在通过“破解编码面试”来完成自己的工作。第一个问题要求“实施一种算法以确定字符串是否具有所有唯一字符”。我的(可能是幼稚的)实现如下: 作者建议以下实现: 是什么使作者的实现比我的更好(FWIW,作者的解决方案是在Java中,我将其转换为Python -我的解决方案是无法在Java中实现的解决方案)吗?或者,更一般而言,解决该问题需要什么?我采用的方法有什

  • 问题内容: 我想将字符添加到字符串中,但要确保最终列表中的所有字母都是 唯一的 。 例如:→ 现在,我当然想到了两种解决方案。一种是使用,它将字符与ASCII码映射。因此,每当我遇到一个字母时,它都会将索引设置为。之后,我将扫描列表并附加所有已设置的列表。时间复杂度为 O(n) 。 另一个解决方案是使用和遵循相同的过程。映射完每个字符后,我将对字典中的每个键进行操作。这也将具有 线性 运行时间。

  • 问题内容: 我对位向量如何实现此功能感到困惑(对位向量不太熟悉)。这是给出的代码。有人可以引导我完成这个吗? 特别是,这是怎么做的? 问题答案: 在这里用作位存储。整数值中的每个位都可以视为一个标志,因此最终是一个位数组(标志)。代码中的每一位都说明是否在字符串中找到带有位索引的字符。您可以出于相同的原因而不是使用位向量。它们之间有两个区别: 大小 。具有固定大小,通常为4个字节,这意味着8 *

  • 问题内容: 我的字符串中有双引号,因为我会这样做: 我将如何用Java做到这一点? 问题答案: 否。此类功能在Java中不可用。 从Sun 文档: 当在打印语句中遇到转义序列时,编译器将对其进行相应的解释。例如,如果要将引号放在引号内,则必须在内部引号上使用转义序列\“。要打印句子 你会写

  • 代码非常简单。它会检查所有字符一次,并替换第一次出现的字符。然而,输入=“aab”失败。我不知道为什么。编程语言是java。 编辑 我改了密码。现在它抛出了一个输入错误 错误: 线程“main”java中出现异常。util。正则表达式。PatternSyntaxException:索引1附近的未关闭组(^at java.util.regex.Pattern.error,Pattern.java:1

  • 我想检查两个代码是否包含一个代码中的所有字符,并忽略它有额外字符的事实。