我知道如何在数组中找到重复的元素但是最近在一个采访问题中,我被要求在一次传递中找到数组中的重复元素,而不使用嵌套循环和递归。我试过但失败了。面试官甚至没有给我一点暗示。所以我来到这里问,是否有可能在没有嵌套循环/递归的数组中找到重复的元素?如果是,是否有人可以提供示例代码?还不允许使用库函数
P.S 我还想知道如果我们不使用循环或递归会有什么影响。它与复杂性有关吗?
答案 0 :(得分:4)
您可以为每个项目值保留一个包含项目计数的哈希表/字典。
答案 1 :(得分:0)
由于你没有提到有关数组的任何内容,我认为单次传递是不可能的。我不确定计算排序是否是您正在寻找的答案。因此,您问题的唯一解决方案是使用字典。这是我在C中找到的最简单的字典实现。
Quick Way to Implement Dictionary in C
希望这有帮助。
答案 2 :(得分:0)
由于您希望在线性时间内找到重复项,例如一次通过,您必须使用其他数据结构来计算每个元素出现的次数。
这里我假设数组是整数。这适用于任何类型。我使用一个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]
。
答案 3 :(得分:-1)
我假设整数的大小是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
中重复值的次数。
答案 4 :(得分:-1)
简单但有创意的解决方案: 建议对数组进行排序的要求 - 然后它将变得微不足道。 (但这就是面试问题的工作原理)