查找字符串或字符数组中每个字符的出现次数

时间:2014-07-09 23:33:24

标签: arrays string unicode ascii

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

4 个答案:

答案 0 :(得分:1)

由于Unicode仅定义[0,2 21 )范围内的代码点,因此您只需要一个2 21 (即200万)元素的数组,适合记忆。

答案 1 :(得分:1)

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

相反,请考虑使用两个平行向量,一个用于字符,一个用于计数。设置看起来像这样:

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

编辑

在看到Kerrek的答案之后,我必须承认,一个200万的阵列是合理的。它将占用的内存量将在兆字节范围内。

但是,正如它的采访一样,我不推荐使用长度为200万个数组的数组,特别是如果其中许多插槽未被使用(并非所有Unicode字符都会出现,很可能)。他们可能正在寻找更优雅的东西。

第二次编辑

根据这里的评论,Kerrek的答案确实似乎更有效,也更容易编码。

答案 2 :(得分:0)

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

您可能希望查看Unicode规范化表单。这很有趣。

答案 3 :(得分:0)

  1. 将字符串转换为UTF-32。

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

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