所以给定n个具有一系列数字的组(在给定的组中没有数字会重复。如何在2组或更多组中搜索两次出现的数字。
例如:
A:1,2,3,4,5
B:1,6,7,8,9
C:3.10,11,12
答案是:1和3,因为它们在三组中至少出现两次
我尝试过将x组中的每个元素与gorup Y中的另一个元素进行比较等等,但这并不高效,需要很长时间来计算更大的数据。
答案 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类具有您可以使用的内置排序方法)