在整数数组中查找重复项,并在C ++中按实际顺序打印它们

时间:2015-10-24 16:08:27

标签: c++ arrays algorithm duplicates hashtable

我在通过互联网找到问题的解决方案时遇到了问题。

我有一个包含正数和负数的整数数组。如下所示

int arr[] = {56, 1, -1, 89, 89, 7 ,0, 5, 5, 56, 0,9 22, 33,67, 7, -1}

我需要找到数组中的所有重复项。 需要显示输出(请注意订单保持),如下所示:

 56 -1 89 7 0 5 

我知道在O(n)时间内可以使用散列找到重复项。但我在维持秩序方面遇到了问题。 我也不太了解C ++标准哈希。

任何人都可以建议我,如何在C ++中做到这一点。允许STL使用。

1 个答案:

答案 0 :(得分:1)

以相反的顺序扫描输入数组中的重复项,跟踪最后出现的重复项。然后反转该列表,您将按照输入数组中首次出现的顺序列出重复项。

e.g。

  • 从输入数组的结尾循环

  • 将每个值添加到无序集

  • 如果该值已存在,则为重复。将其添加到重复列表中 (value->position)的地图,替换之前的任何值。

扫描输入数组完成后,按位置对重复列表进行排序,并将这些值放入列表中。

与具有位置和重复计数的每个条目(甚至是非重复项)相比,使用无序集和具有位置的单独重复列表可减少存储开销。如果只有少量重复项,它还可以减少所需的时间。 (因为您不必遍历所有值的整个集合,只需查找重复计数> 1的值。)