Algorithm: efficient way to remove duplicate integers from an array

前端 未结 30 2090
离开以前
离开以前 2020-11-22 16:03

I got this problem from an interview with Microsoft.

Given an array of random integers, write an algorithm in C that removes duplicated numbers an

相关标签:
30条回答
  • 2020-11-22 16:17

    In Java I would solve it like this. Don't know how to write this in C.

       int length = array.length;
       for (int i = 0; i < length; i++) 
       {
          for (int j = i + 1; j < length; j++) 
          {
             if (array[i] == array[j]) 
             {
                int k, j;
                for (k = j + 1, l = j; k < length; k++, l++) 
                {
                   if (array[k] != array[i]) 
                   {
                      array[l] = array[k];
                   }
                   else
                   {
                      l--;
                   }
                }
                length = l;
             }
          }
       }
    
    0 讨论(0)
  • 2020-11-22 16:19

    The following example should solve your problem:

    def check_dump(x):
       if not x in t:
          t.append(x)
          return True
    
    t=[]
    
    output = filter(check_dump, input)
    
    print(output)
    True
    
    0 讨论(0)
  • 2020-11-22 16:19

    It'd be cool if you had a good DataStructure that could quickly tell if it contains an integer. Perhaps a tree of some sort.

    DataStructure elementsSeen = new DataStructure();
    int elementsRemoved = 0;
    for(int i=0;i<array.Length;i++){
      if(elementsSeen.Contains(array[i])
        elementsRemoved++;
      else
        array[i-elementsRemoved] = array[i];
    }
    array.Length = array.Length - elementsRemoved;
    
    0 讨论(0)
  • 2020-11-22 16:20

    Here is a Java Version.

    int[] removeDuplicate(int[] input){
    
            int arrayLen = input.length;
            for(int i=0;i<arrayLen;i++){
                for(int j = i+1; j< arrayLen ; j++){
                    if(((input[i]^input[j]) == 0)){
                        input[j] = 0;
                    }
                    if((input[j]==0) && j<arrayLen-1){
                            input[j] = input[j+1];
                            input[j+1] = 0;
                        }               
                }
            }       
            return input;       
        }
    
    0 讨论(0)
  • 2020-11-22 16:21

    This can be done in one pass with an O(N log N) algorithm and no extra storage.

    Proceed from element a[1] to a[N]. At each stage i, all of the elements to the left of a[i] comprise a sorted heap of elements a[0] through a[j]. Meanwhile, a second index j, initially 0, keeps track of the size of the heap.

    Examine a[i] and insert it into the heap, which now occupies elements a[0] to a[j+1]. As the element is inserted, if a duplicate element a[k] is encountered having the same value, do not insert a[i] into the heap (i.e., discard it); otherwise insert it into the heap, which now grows by one element and now comprises a[0] to a[j+1], and increment j.

    Continue in this manner, incrementing i until all of the array elements have been examined and inserted into the heap, which ends up occupying a[0] to a[j]. j is the index of the last element of the heap, and the heap contains only unique element values.

    int algorithm(int[] a, int n)
    {
        int   i, j;  
    
        for (j = 0, i = 1;  i < n;  i++)
        {
            // Insert a[i] into the heap a[0...j]
            if (heapInsert(a, j, a[i]))
                j++;
        }
        return j;
    }  
    
    bool heapInsert(a[], int n, int val)
    {
        // Insert val into heap a[0...n]
        ...code omitted for brevity...
        if (duplicate element a[k] == val)
            return false;
        a[k] = val;
        return true;
    }
    

    Looking at the example, this is not exactly what was asked for since the resulting array preserves the original element order. But if this requirement is relaxed, the algorithm above should do the trick.

    0 讨论(0)
  • 2020-11-22 16:22

    Given an array of n elements, write an algorithm to remove all duplicates from the array in time O(nlogn)

    Algorithm delete_duplicates (a[1....n])
    //Remove duplicates from the given array 
    //input parameters :a[1:n], an array of n elements.
    
    {
    
    temp[1:n]; //an array of n elements. 
    
    temp[i]=a[i];for i=1 to n
    
     temp[i].value=a[i]
    
    temp[i].key=i
    
     //based on 'value' sort the array temp.
    
    //based on 'value' delete duplicate elements from temp.
    
    //based on 'key' sort the array temp.//construct an array p using temp.
    
     p[i]=temp[i]value
    
      return p.
    

    In other of elements is maintained in the output array using the 'key'. Consider the key is of length O(n), the time taken for performing sorting on the key and value is O(nlogn). So the time taken to delete all duplicates from the array is O(nlogn).

    0 讨论(0)
提交回复
热议问题