如何通过丢弃重复元素来查找数组中的一系列唯一数字

时间:2014-09-01 17:34:32

标签: c arrays

我能够在给定的代码段中找出排序数组中的唯一元素。 我需要一个解决方案,通过避免重复数字来查找唯一元素,即来自格式为{0,1,1,2,3,4,4,1,3,5,9,12,12,13,14}的非排序数组。

C计划:

#include<stdio.h>
#define ARRAY_SIZE  15
int main()
{
  int arr[ARRAY_SIZE]={0,1,1,2,3,4,4,1,3,5,9,12,12,13,14};
  int i=0,j=0,t;
  printf("\nThe Array elements are : ");
  for(i=0; i<ARRAY_SIZE;i++)
  printf("%d ",arr[i]);
  for (j=0 ; j<(ARRAY_SIZE-1) ; j++)
      {
         for (i=0 ; i<(ARRAY_SIZE-1) ; i++)
             {
                if (arr[i+1] < arr[i])
                   {
                      t = arr[i];
                      arr[i] = arr[i + 1];
                      arr[i + 1] = t;
             }
      }
}
  printf("\n\nunique elements are : ");
  printf("%d ",arr[0]);
  for(i=1;i<ARRAY_SIZE;i++)
    {
        /* check current number and prev number if they are different that mean we met    
        another unique element */

        if(arr[i-1]^arr[i])
        /*a^b = zero only if two numbers are different*/                                        
         {        
           printf("%d ",arr[i]);
         }
    }
return 0;
}

3 个答案:

答案 0 :(得分:1)

这可能有点矫枉过正,但是:

#include <stdio.h>
#include <stdlib.h>

int array_contains(const int* arr, size_t len, int elem) {
    int i;
    for (i=0; i!=len; ++i)
        if (arr[i]==elem)
            return 1;
    return 0;
}

void print_uniques(const int* arr, size_t len) {
    size_t uniques_len = 0;
    int uniques_arr[len];
    int i;
    for (i=0; i!=len; ++i)
        if (!array_contains(uniques_arr, uniques_len, arr[i]))
            uniques_arr[uniques_len++] = arr[i];
    for (i=0; i!=uniques_len; ++i)
        printf("%d ", uniques_arr[i]);
    printf("\n");
}

#define ARRAY_SIZE  15
int main()
{
    int arr[ARRAY_SIZE]={0,1,1,2,3,4,4,1,3,5,9,12,12,13,14};
    print_uniques(arr, ARRAY_SIZE);
    return 0;
}

是的,这是O(N^2)。您可以通过使用某种哈希集而不是维护无序列表来改进这一点。我也会查看hsearch

答案 1 :(得分:1)

/*
To avoid too many iterations, after finding the duplicates  break the inner loop 
*/
#include <stdio.h>
#include  <stdlib.h>
int main()
{
   int a[] = {50,1, 34, 1, 3, 11, 75, 3, 4, 9, 11, 4, 9, 3, 34, 100,0,100};
   int arr[sizeof(a)/ sizeof(a[0])] = { 0 };

   int i = 0, j = 0;

   for(i = 0; i < (sizeof(a) / sizeof(a[0])); i++)
   {
       for(j = i+1; j < (sizeof(a)/ sizeof(a[0])); j++)
       {
           if(a[i] == a[j])
           {
               ++arr[i];
               ++arr[j];
               break; // used to avoid too many iterations.
           }
       }
       if(arr[i] == 0) //must have unique number
       {
           printf ("The unique numbers = %d\n", a[i]);
       }
   }
   return 0;  
}

答案 2 :(得分:0)

如果没有性能要求,您可以执行以下操作:

  
      
  1. 对数组进行排序。
  2.   
  3. 执行您发布的代码。
  4.