在数组中查找重复项

时间:2016-03-09 11:09:20

标签: c arrays duplicates

我知道如何在数组中找到重复的元素但是最近在一个采访问题中,我被要求在一次传递中找到数组中的重复元素,而不使用嵌套循环和递归。我试过但失败了。面试官甚至没有给我一点暗示。所以我来到这里问,是否有可能在没有嵌套循环/递归的数组中找到重复的元素?如果是,是否有人可以提供示例代码?还不允许使用库函数

P.S 我还想知道如果我们不使用循环或递归会有什么影响。它与复杂性有关吗?

5 个答案:

答案 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)

简单但有创意的解决方案: 建议对数组进行排序的要求 - 然后它将变得微不足道。 (但这就是面试问题的工作原理)