【问题标题】:Finding the number of occurrences of each character in a String or character array查找字符串或字符数组中每个字符的出现次数
【发布时间】:2014-08-31 03:59:20
【问题描述】:

我正在阅读一些面试准备材料,我想知道如果字符串或数组中的字符可以是 unicode 字符,那么解决这个问题的最佳方法是什么。如果它们是严格的 ascii,您可以创建一个大小为 256 的 int 数组并将每个 ascii 字符映射到一个索引,并且该数组中的位置将表示出现的次数。如果字符串具有 unicode 字符,是否仍然可以这样做,即 unicode 字符的大小是否合理,您可以使用整数数组的索引来表示它?由于 unicode 字符的大小可以超过 1 个字节,您将使用什么数据类型来表示它们?这种情况下的最佳解决方案是什么?

【问题讨论】:

    标签: arrays string unicode ascii


    【解决方案1】:

    由于 Unicode 只定义 [0, 221) 范围内的代码点,因此您只需要一个包含 221(即 200 万)个元素的数组,这应该舒适地融入记忆。

    【讨论】:

      【解决方案2】:

      使用 Unicode 时,数组不实用。这是因为 Unicode 定义(少于)221 个字符。

      请考虑使用两个并行向量,一个用于字符,一个用于计数。设置如下所示:

      <'c', '$', 'F', '¿', '¤'>    //unicode characters
      < 1 ,  3 ,  1 ,  9 ,  4 >    //number of times each character has appeared.
      

      编辑

      在看到 Kerrek 的回答后,我必须承认,200 万大小的数组是合理的。它将占用的内存量将在兆字节范围内。

      但由于是面试,我不建议使用 200 万个元素长的数组,特别是如果其中许多插槽未使用(很可能并非所有 Unicode 字符都会出现)。他们可能正在寻找更优雅的东西。

      二次编辑

      根据这里的 cmets,Kerrek 的答案确实似乎更高效且更易于编码。

      【讨论】:

      • 您能解释一下为什么使用数组不实用吗?你不会使用与向量相同数量的内存(如果不是更多的话)吗?另外,我们用什么数据类型来表示 Java 或 C 等语言中的 unicode 字符。我问是因为 char 只有 1 个字节。
      • 你怎么知道向量中每个 unicode 字符映射到哪个索引?如果您不知道这一点,那么当您想要增加字符数时,您必须进行线性搜索。
      • 是的。我们可以保持向量的排序,这样会稍微快一点,但是每次遇到新字符时我们都需要求助。那我同意。由于数组索引的查找时间恒定,您的解决方案将更容易编码并且很可能更有效。
      【解决方案3】:

      虽然这里的其他人专注于数据结构,但您也应该知道“Unicode 字符”的概念有些不明确。这是一个潜在的面试陷阱。考虑一下:åå 是同一个字符吗?第一个是“上面有环的拉丁小写字母 a”(代码点 U+00E5)。第二个是“拉丁小写字母 a”(代码点 U+0061),后跟一个“上面的组合环”(U+030A)。根据计数的目的,您可能需要将它们视为相同的字符。

      您可能想查看 Unicode 规范化表单。很好玩。

      【讨论】:

      • 这是一个反问句。 AndroidDev93 想知道如何回答关于计算 Unicode 字符的假设面试问题。我指出 Unicode 字符的概念有些不明确,这是他应该考虑的。
      【解决方案4】:
      1. 将字符串转换为 UTF-32。

      2. 对 32 位字符进行排序。

      3. 现在获取字符数很简单。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-19
        • 1970-01-01
        • 2022-10-15
        • 2021-02-25
        • 2021-06-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多