我在通过互联网找到问题的解决方案时遇到了问题。
我有一个包含正数和负数的整数数组。如下所示
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使用。
答案 0 :(得分:1)
以相反的顺序扫描输入数组中的重复项,跟踪最后出现的重复项。然后反转该列表,您将按照输入数组中首次出现的顺序列出重复项。
e.g。
从输入数组的结尾循环
将每个值添加到无序集
如果该值已存在,则为重复。将其添加到重复列表中
(value->position
)的地图,替换之前的任何值。
扫描输入数组完成后,按位置对重复列表进行排序,并将这些值放入列表中。
与具有位置和重复计数的每个条目(甚至是非重复项)相比,使用无序集和具有位置的单独重复列表可减少存储开销。如果只有少量重复项,它还可以减少所需的时间。 (因为您不必遍历所有值的整个集合,只需查找重复计数> 1的值。)