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