我在练习面试问题,其中一个问题是:“实现一个算法来确定字符串是否具有所有唯一的字符”。
但我的问题是:如果我们假设string可以包含象形文字符号或任何东西(代码点大于u+ffff...?),那么该如何解决。
所以,如果我理解的正确,我可以很容易地想到解决方案,如果给定的字符串包含的字符属于从u+0000到u+ffff的字符集--它们可以转换成16位char,但如果我遇到一个字符的代码点大于u+ffff...?
码位大于U+FFFF的字符称为辅助字符。Java平台在char数组以及String和StringBuffer类中使用UTF-16表示。在此表示中,补充字符表示为一对字符值,第一个值来自高替代范围(\ud800-\udbff),第二个值来自低替代范围(\udc00-\udfff)
但我不知道如何解决这个谜题在那种情况下,我如何处理那些代理对?
谢谢!
Java8有一个charSequence#codepoints
方法,它在字符串中生成Unicode代码点的IntStream
。从那时起,就变成了编写代码来测试IntStream
中元素的唯一性的问题。
如果您还在Java7或更低的版本中,也可以使用基于代码点的方法来解决这个问题,但使用起来要复杂得多。您必须循环访问字符串的char
s,并检查每个值,以判断是否在处理代理项对。类似于(完全未经测试的):
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
我想检查两个代码是否包含一个代码中的所有字符,并忽略它有额外字符的事实。