给定一组带有一系列数字的列表/组,找到匹配的数字

时间:2013-08-12 15:24:33

标签: java algorithm

所以给定n个具有一系列数字的组(在给定的组中没有数字会重复。如何在2组或更多组中搜索两次出现的数字。

例如:

A:1,2,3,4,5

B:1,6,7,8,9

C:3.10,11,12

答案是:1和3,因为它们在三组中至少出现两次

我尝试过将x组中的每个元素与gorup Y中的另一个元素进行比较等等,但这并不高效,需要很长时间来计算更大的数据。

5 个答案:

答案 0 :(得分:5)

确定一组项是否包含重复元素的一种更有效的方法是使用HashSet。浏览所有元素并将它们添加到HashSet,但在添加元素之前检查HashSet是否已包含该项。如果该项目已经存在于HashSet中,则该项目已存在于其他位置,并且是重复的。

无需确保使用此方法对数据进行排序。对任何数据进行排序最多为O(n lg n)。 HashSet方法只是O(n)。

为了澄清评论中的混淆,这里是算法的伪代码版本。

for Integer e in allLists {
    if (hashSet.contains(e)) {
        //e was added in a previous iteration of the loop and thus e is a duplicate
        results.add(e);
    } else {
        hashSet.add(e); 
    }
}

答案 1 :(得分:2)

我会使用全局HashMap<Integer, Integer>来计算数组中显示的每个数字的计数。

由于它被声明为,没有列表将包含重复的元素,要找出两个或更多列表中的数字,只需遍历地图的键集并检查其对应的counter

复杂性:O(N)其中N是列表数组中的整数总数。

答案 2 :(得分:1)

我无法真正为您提供任何特定代码,因为我不知道您的数据当前是如何存储的,但您可能需要尝试以下步骤:

- 将每个列表中的所有值添加到一个主列表中。

- 排序主列表。

- 对此列表进行迭代,将多次出现的值添加到结果列表中。

编辑:由于您正在使用List,因此您需要将每个字符串拆分为整数列表。你应该能够自己解决如何做到这一点(至少试一试)。

答案 3 :(得分:0)

如果对数据进行了排序,如上所示,则可以对其进行优化。不要将每个列表中的每个元素与彼此进行比较,而是将A中的元素与B中的元素进行比较,直到B中元素的值大于A中的值。这仅在您的数据已排序时有效,如在问题

答案 4 :(得分:0)

您没有说明这些是如何存储的(例如在数组或链接列表中),或者数据将始终按此处所示的排序顺序排列,因此方法会因此而有所不同。

假设你有一个排序值数组,我将遍历列表A中的每个元素并在列表B和C中进行二进制搜索。然后我将遍历列表B中的所有元素并进行二分查找在列表C中。如果数据未排序,您应该首先使用排序算法对其进行排序(尽管我认为Arrays类具有您可以使用的内置排序方法)