我知道如何在数组中查找重复元素,但最近在一次面试中,我被要求在单次遍历数组中查找重复元素,这意味着不能使用嵌套循环和递归。我尝试了,但失败了。 面试官甚至没有给我提示。 所以我来这里问,是否可以在不使用嵌套循环/递归的情况下找到数组中的重复元素? 如果是,请问有人能提供一个示例代码吗?同时,库函数不允许使用。
另外,如果我们不使用循环或递归,会对复杂度产生什么影响?
另外,如果我们不使用循环或递归,会对复杂度产生什么影响?
continue
将多个循环合并为一个。 - autistic由于您想要在线性时间内查找重复项,例如一次遍历,因此必须使用附加的数据结构来计算每个元素出现的次数。
在这里,我假设数组是整数类型。但是,这对于任何类型都适用。我使用一个HashMap,将元素(在本例中为整数)用作键,将出现次数用作值。
public static ArrayList<Integer> findDuplicates(int[] arr) {
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int i = 0; i < arr.length; i++) {
if (!map.containsKey(arr[i]))
map.put(arr[i], 1);
else
map.put(arr[i], map.get(arr[i]) + 1);
}
ArrayList<Integer> dups = new ArrayList<Integer>();
for (Integer i : map.keySet())
if (map.get(i) > 1)
dups.add(i);
return dups;
}
所以
int arr[] = {1,2,3,4,2,1,2,3,4,5,6,7,8};
findDuplicates(arr);
将返回[1, 2, 3, 4]
。
由于您没有提及数组,我认为无法在单次遍历中完成。我不确定计数排序是否是您要寻找的答案。因此,解决您问题的唯一方法是使用字典。这是我在C语言中找到的最简单的字典实现。
希望这可以帮助您。
我假设整数的大小为2个字节。
#define ARRAY_SIZE 10
int array[ARRAY_SIZE] = {2,3,1,5,1,6,7,7,8,1};
int duplicate[65535] = {0};
for(char i = 0;i< ARRAY_SIZE;i++)
{
duplicate[array[i]]++;
if(duplicate[array[i]] > 1)
{
printf(" %d is duplicate in array",array[i]);
}
}
duplicate
数组的每个索引显示了一个值在 array
中重复出现的次数。简单而有创意的解决方案: 提出要求,数组应该被排序 - 然后它就会变得微不足道。(但这就是面试问题的工作方式)