我最近发现了一个类似的问题:
"Given an array of strings, return the number of distinct strings in that array."
我提出了这个解决方案:
1. Get number_of_strings, which equals the number of strings in the input array
2. Get number_of_non_redundant, which equals the length of the input array cast as a set
3. Return 2 times number_of_non_redundant - number_of_strings
所以,我的问题是,这个算法是否适用于所有数据集?
答案 0 :(得分:4)
考虑字符串数组["a", "a", "a", "d", "d", "d"]
。
number_of_strings
是6; number_of_non_redundant
是2.您建议退回2 * 2 - 6 = -2
。所以......不,你的算法不适用于所有数据集。
除非我对这个问题有很大的误解,否则返回number_of_non_redundant
将永远有效,因为它是你想要返回的定义。 :)
答案 1 :(得分:2)
正如其他人所指出的,简单地回归number_of_non_redundant
似乎就是这个问题的答案。
以下是确定number_of_non_redundant
的可能解决方案:
1)创建一个哈希集(特定于语言)
2)在数组的每个元素上迭代整个数组 检查哈希集中是否存在该元素,如果不存在,则添加 它
3)返回哈希集的大小。
在此使用哈希集提供恒定时间操作(添加,包含)。
此外,我想指出你不能(至少我不会在语言中注意到这一点)只需将数组转换为集合。 Casting 是一个恒定时间操作。这是两种不同的数据结构,为了从数组中获取元素并将它们放在一个集合中,它需要遍历数组并将元素输入到集合中。
答案 2 :(得分:0)
首先按字典顺序对数组进行排序,然后使用标志变量对其进行循环,以跟踪元素i-th和第(i-1)-th之间的变化?
答案 3 :(得分:0)
此算法不会适用于所有数据集。它可能适用于具体的例子。
say n = number of non redundant strings
p = number of strings in original array
根据你2n-p = n => n= p
您的算法仅在(number of non redundant strings = length of original array)
时有效,这意味着仅当原始数组是一个集合时。
只是提示一下,解决这个问题的理想方法是散列,如果你有足够的可用内存,或者你可以使用排序来实现它,但与散列相比需要更长的时间