【问题标题】:Why does 'Cracking The Coding Interview' advices to create an array chars[128]? [closed]为什么“Cracking The Coding Interview”建议创建一个数组 chars[128]? [关闭]
【发布时间】: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)。您的学习帮助掩盖了主要参考文献中的基本信息。您的问题代表了良好的批判性思维。

标签: java unicode ascii


【解决方案1】:

本书提供的答案建议读者询问字符是 Unicode 还是 ASCII 以展示一些洞察力。

然而作者继续假设使用 128 个字符的 ASCII,所以这就是使用 128 数组大小的原因。

它还提到可以假定扩展 ASCII 为 256 个字符。在这种情况下,应该使用 256 大小的数组。

作者还提到,在 Unicode 的情况下,应该增加数组大小,但并没有真正指定大小。

基于 Tom Blodget 的评论的澄清是,在问题和答案中都有隐含的假设,即函数“isUniqueChars”的字符串参数“str”作为输入给出,例如读取文件。 ASCII、扩展 ASCII 等的限制适用于此输入,而不适用于 Java 字符串本身。这是因为 Java 中的所有字符和字符串都是 UTF-16。

【讨论】:

  • Java 中的所有字符和字符串都是 UTF-16。关键是:是否存在识别子集的性能需求以及是否存在可识别的子集。对于练习,有时会使用 C0 Controls and Basic Latin 块,有时还会使用 C1 Controls 和 Latin 1 Supplement 块。我想我从来没有参与过一个喜欢如此有限的角色的项目。
  • 这绝对是真的。上面没有说明的是假设函数“isUniqueChars”的字符串参数“str”由文件或其他输入读取。 ASCII、扩展ASCII 等的限制应该适用于这个输入。事实上,它没有在任何地方明确提及,所以我将编辑答案以反映这一点。
  • 但是,大多数“扩展 ASCII”字符集都有一些字符不能映射到 U+0000 到 U+00FF 范围,因此 256 元素数组不起作用。
  • 这很有趣。实际上,如果 UTF-16 的字符不在扩展 ASCII 范围内映射,则 256 数组将抛出越界异常。
猜你喜欢
  • 1970-01-01
  • 2017-10-24
  • 1970-01-01
  • 1970-01-01
  • 2021-07-19
  • 1970-01-01
  • 2011-12-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多