【发布时间】:2018-07-29 22:45:27
【问题描述】:
据我所知,Java 语言中有 65,535 个字符。 同时,Unicode 11.0 包含 137,439 个符号。 我正在阅读 Cracking The Coding Interview 并且无法理解当前解决方案的内部结构。
如果可以有 137,439 个 Unicode 符号,为什么本书建议在 String 表示 Unicode 的情况下创建一个数组 chars[128]?
我不熟悉编码,你能详细解释一下吗?
是唯一的:实现一种算法来确定字符串是否具有所有唯一字符。如果您不能使用其他数据结构怎么办?
解决方案
您应该首先询问您的面试官该字符串是 ASCII 字符串还是 Unicode 字符串。问这个问题 将显示出对细节的关注和计算机科学的坚实基础。为简单起见,我们假设字符 设置为 ASCII。如果这个假设不成立,我们就需要增加存储大小。 一种解决方案是创建一个布尔值数组,其中索引 i 处的标志指示字符是否 字母表中的 i 包含在字符串中。第二次看到这个角色你可以立即 返回假。 如果字符串长度超过了字符串中唯一字符的数量,我们也可以立即返回 false 字母。毕竟,您无法从 128 个字符的字母表中形成一个包含 280 个唯一字符的字符串。 I 假设 256 个字符也是可以的。这将是扩展 ASCII 的情况。你应该 与面试官澄清你的假设。 下面的代码实现了这个算法。
boolean isUniqueChars(String str) {
if (str.length() > 128) return false;
boolean[] char_set = new boolean[128];
for (int i= 0; i < str.length(); i++) {
int val= str.charAt(i);
if (char_set[val]) { //Already found this char in string
return false;
}
char_set[val] = true;
}
return true;
}
【问题讨论】:
-
上面写着“为简单起见,我们假设字符集是 ASCII”
-
毕竟,你不能从一个 128 个字符的字母表中形成一个由 280 个唯一字符组成的字符串 你有一个 128 个字符的字母表...
-
您应该编辑您的问题,以便在阅读时更有意义。写下这本书和作者的名字,并让读者知道书中引用了什么以及你写了什么。
-
Unicode 代码点需要 21 位的范围。 UTF-16 将这 21 位编码为一个或两个 16 位代码单元 (
char)。您的学习帮助掩盖了主要参考文献中的基本信息。您的问题代表了良好的批判性思维。