【问题标题】:Merge two arrays and omit all repeating elements合并两个数组并省略所有重复元素
【发布时间】:2013-12-06 03:42:52
【问题描述】:

我有 2 个数组。输入 1 和输入 2。假设输入 1 有 {1,1,2,3,3,4,5},输入 2 有 {4,2,6,7,8}。合并数组 {1,1,2,3,3,4,5,4,2,6,7,8}

排序后我的合并数组看起来像 {1,1,2,2,3,3,4,4,5,6,7,8}

我的输出应该像 {5,6,7,8} 因为它们是非重复元素。它不应该在第一次出现两次,也不应该在第一次和第二次出现一次。

我已将两个数组放入一个数组中(将两者合并)。对其进行排序并删除重复项。我得到像 {1,2,3,4,5,6,7,8} 这样的输出,但我不应该得到 1,2,3,4,因为它们都在合并数组中出现了两次。

请帮助我尽快完成该计划。提前致谢。

我不能使用结构。那是我的任务。

#include<stdio.h>
#include<conio.h>
main()
{
    int a[10],b[10],c[10],i,j,n,n1,temp;
    clrscr();
    printf("enter the no of ele in array1\n");
    scanf("%d",&n);
    printf("enter 1st array elements\n");
    for(i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    printf("enter size of 2nd array");
    scanf("%d",&n1);
    printf("enter 2nd array elements\n");
    for(i=0;i<n;i++)
    {
        scanf("%d",&b[i]);
    }

    for(i=0;i<n;i++)
    {
        c[i]=a[i];
    }
    j=0;
    for(i=n;i<n+n1;i++)
    {
        c[i]=b[j];
          //    printf("\n2nd array values are %d",c[i]);
        j++;
    }
    for(i=0;i<n+n1;i++)
    {
        printf("%d\n",c[i]);
    }
    for(i=0;i<n-1;i++)
    {
        for(j=0;j<n-i-1;j++)
        {
            if(c[j]>c[j+1])
            {
                temp=c[j];
                c[j]=c[j+1];
                c[j+1]=temp;
            }
        }
    }
    for(j=0;j<n+n1;j++)
    {
        printf("sorted is %d\n",c[j]);
    }

    for(i=0;i<n+n1;i++)
    {
        if(c[i]==c[i+1])
        {
            temp=c[i];

         // printf("%d r d rep.ele\n",c[i]);
        }
        else
        printf("%d r d ele\n",c[i]);
    }

    getch();
}

【问题讨论】:

  • 到目前为止你尝试了什么?
  • Please help me to finish the program soon. -- 你开始了吗?
  • 如果您要删除重复项,您会得到{1,2,3,4,5,6,7,8},对吗?你的算法不需要重复来过滤掉它们吗?
  • 请粘贴您的代码片段。
  • 显示你尝试了什么

标签: c arrays merge


【解决方案1】:

让我们以一种不恰当但有趣的方式解决这个问题:

#include <stdio.h>

#define MAXINPUT 10

void pack(const int* k, int n, int* table)
{
  for(int i = 0; i < n; ++i)
  {
    table[k[i]]++;
  }
}

void dump(const int* table)
{
  int flag = 0;
  for(int i = 0; i < MAXINPUT; ++i)
  {
    if(table[i] == 1)
    {
      printf("%s%d", (flag) ? ", " : "", i);
      flag = 1;
    }
  }
}

int c[MAXINPUT];

int main(void)
{
  const int a[] = { 1, 1, 2, 3, 3, 4, 5};
  const int b[] = { 4, 2, 6, 7, 8};
  pack(&a[0], sizeof(a)/sizeof(int), &c[0]);
  pack(&b[0], sizeof(b)/sizeof(int), &c[0]);
  dump(&c[0]);
  return 0;
}

【讨论】:

    【解决方案2】:
    size_t i, non_repeating_index = 0;
    
    // allocate memory to hold the new array
    int * non_repeating_elements = calloc(sizeof(int), merged_array_length);
    
    // check if the first element is unique
    if (merged_array_length >= 2 && merged_array[0] != merged_array[1])
        non_repeating_elements[non_repeating_index++] = merged_array[0];
    
    // for all other elemnts check if it equals the ones around it
    for (i = 1; i < merged_array_length -1; i++) {
        if (merged_array[i-1] != merged_array[i] && merged_array[i] != merged_array[i + 1])
            non_repeating_elements[non_repeating_index++] = merged_array[i];
    }
    
    // check the last element
    if (merged_array_length >= 3 && merged_array[i-1] != merged_array[i])
        non_repeating_elements[non_repeating_index++] = merged_array[i];
    
    // resize the array to conserve memory
    non_repeating_elements = realloc(non_repeating_elements, sizeof(*non_repeating_elements) * non_repeating_index);
    

    【讨论】:

      【解决方案3】:

      你快到了!不要试图花哨,只需创建一个具有两个 int 字段的结构:value 和 count。创建这些结构的数组并遍历您的排序列表。最后,您遍历结构数组并选择相应计数为 1 的所有值。

      有一些细节需要整理,比如你的结构数组应该有多大,但是嘿,你显然不害怕一点编码。如果数组比你需要的大,那么……只要它足够大,谁在乎呢?

      【讨论】:

        【解决方案4】:

        如果您已经对数组进行了排序和合并,这非常简单:只需与前任和继任者进行比较即可。但是需要一些额外的逻辑才能不超出范围。

        #include <stdio.h>
        
        int main(int argc, char** argv){
          const int sortedMergedArray[] = {1,1,2,2,3,3,4,4,5,6,7,8};
          const size_t mergedArrayLength = 12;
          for(size_t i=0; i<mergedArrayLength;i++){
            int predecessor = -1;
            int successor = -1;
            if(i >= 1) predecessor = sortedMergedArray[i-1];
            if(i <= mergedArrayLength-1) successor = sortedMergedArray[i+1];
            if(sortedMergedArray[i] != successor &&
                sortedMergedArray[i] != predecessor){
              printf("%d, ", sortedMergedArray[i]);
            }
          }
          return 0;
        }
        

        输出:

        5, 6, 7, 8, 
        

        【讨论】:

        • 你能告诉我你在 if 循环中做什么。 if(i>=1) 和 if(i
        • @user3018163 它阻止对第一个/最后一个元素使用前任和后继(因为那时没有前任/后继),你会超出界限。如果您只是做int predecessor = sortedMergedArray[i-1]; int successor = sortedMergedArray[i+1]; 并保留两个 if 条件,那么对于第一个元素,它将尝试在索引 -1 处获取前一个元素(这是一个非法的数组索引),对于最后一个元素,它将尝试在 lastIndex+1 处获取后继(这也是非法的,因为数组索引从 0...n-1 开始)。
        • 非常感谢。我有另一个程序。我的问题是“比较 2 个数组并打印非重复元素”。假设数组 1={1,1,1,2,3,4} 和数组 2={2,3,6}。输出应为 {1,4,6}。两个数组中都出现了 2 和 3,因此不应打印。虽然 1 在第一个数组中出现了三次,但它没有在数组 2 中出现。所以它也应该被打印出来。请提出一些逻辑或者我应该对该程序本身进行一些修改?
        • @user3018163 如果建议的解决方案解决了您之前的问题,请确保将其标记为已接受的答案。关于新任务,请为此打开一个新问题 - 因为否则在 cmets 中回答此问题或使用不适合初始问题的解决方案编辑我的答案会非常令人困惑。
        【解决方案5】:
        #include <stdio.h>
        #include <stdlib.h>
        #include <string.h>
        #include <stdbool.h>
        
        #define NUMCMP(x,y) (((x) < (y)) ? -1 : ((x) > (y)) ? 1 : 0)
        
        #define numcmp(type) int cmp_##type(const void *a, const void *b){\
            type x = *(type*)a;\
            type y = *(type*)b;\
            return NUMCMP(x,y);\
        }
        
        numcmp(int);//define function cmp_int
        
        void print_array(int a[], size_t size){
            size_t i;
            printf("{");
            for(i=0;i<size;++i){
                printf("%d", a[i]);
                if(i != size-1)
                    printf(",");
            }
            printf("}\n");
        }
        
        int main(void){
            int input1[] = {1,1,2,3,3,4,5};
            int input2[] = {4,2,6,7,8};
            size_t input1_size = sizeof(input1)/sizeof(*input1);
            size_t input2_size = sizeof(input2)/sizeof(*input2);
        
            printf("input1: ");
            print_array(input1, input1_size);
            printf("input2: ");
            print_array(input2, input2_size);
        
            size_t marge_array_size = input1_size + input2_size;
            int marge_array[marge_array_size];
            memcpy(marge_array, input1, input1_size*sizeof(*input1));
            memcpy(&marge_array[input1_size], input2, input2_size*sizeof(*input2));
            printf("marge array: ");
            print_array(marge_array, marge_array_size);
            qsort(marge_array, marge_array_size, sizeof(*marge_array), cmp_int);
            printf("marge array(after sort): ");
            print_array(marge_array, marge_array_size);
        
            size_t singles_size = marge_array_size;
            int *singles = malloc(singles_size * sizeof(*singles));
            size_t i;
            int sp;
            bool drop = false;
            for(sp=-1, i=0;i<marge_array_size;++i){
                if(!drop){
                    if(sp==-1){
                        singles[++sp] = marge_array[i];
                        continue;
                    }
                    if(singles[sp] == marge_array[i]){
                        --sp;
                        drop = true;
                        continue;
                    }
                } else if(singles[sp+1] == marge_array[i])
                    continue;
                drop = false;
                singles[++sp] = marge_array[i];
            }
            if(sp+1 != singles_size){
                singles_size = sp+1;
                singles = realloc(singles, singles_size*sizeof(*singles));
            }
            printf("marge array(single num): ");
            print_array(singles, singles_size);
        
            size_t uniques_size = marge_array_size;
            int *uniques = malloc(uniques_size * sizeof(*uniques));
            for(sp=-1, i=0;i<marge_array_size;++i){
                if(sp==-1){
                    uniques[++sp] = marge_array[i];
                    continue;
                }
                if(uniques[sp] == marge_array[i]){
                    continue;
                }
                uniques[++sp] = marge_array[i];
            }
            if(sp+1 != uniques_size){
                uniques_size = sp+1;
                uniques = realloc(uniques, uniques_size*sizeof(*uniques));
            }
            printf("marge array(uniques num): ");
            print_array(uniques, uniques_size);
            //be free uniques and singles 
            return 0;
        }
        

        【讨论】:

          【解决方案6】:
              #include<stdio.h>
              int main()
            {
               int a[30],b[30];
               int n,k,i,j,p,c=0;
              printf("How many element in first array\n");
              scanf("%d",&n);
              printf("Enter elements");
               for(i=0;i<n;i++)
              {
                 scanf("%d",&a[i]);                //FIRST ARRAY INPUT
              }
          
          
             printf("How many element in second array\n");
            scanf("%d",&k);
            printf("Enter elements");
            for(i=0;i<k;i++)
            {
              scanf("%d",&b[i]);                // SECOND ARRAY INPUT
            }
           printf("The new array is \n");
           for(i=n,j=0;i<(n+k);i++)
             {  
               a[i]=b[j++];                  // MERGE ARRAY B[30],IN A[30] BY EXTEND IT.
             }
          
           for(i=0;i<(n+k);i++)
             {
               printf("%d ",a[i]);        // PRINT THE MERGED ARRAY
             }
          for(i=0,p=0;i<(n+k);i++)        // ELIMINATE DUPLICATE ELEMENTS 
           {
              if(a[i]!=NULL)              
              {
          
                  for(j=i+1;j<(n+k);j++)
                  {
                      if(a[i]==a[j])       // IF ANY ELEMENTS  MATCH TO NEXT OTHERS ARRAY ELEMENTS THEN, THOSE ELEMENTS ARE ASSIGNED BY NULL.   
                      {
                          a[j]=NULL;       
                      }
                  }
                  a[p++]=a[i];
                  c++;               // COUNTING FOR SIZE OF NEW ARRAY
              }
          
          
           }
          printf("\nAfter eliminate the duplicate elements,the new array is : \n");
                   for(i=0;i<c;i++)
                   {
                    printf("%d ",a[i]);           // PRINT NEW ARRAY
                   }
            return 0;
          
            }
          

          【讨论】:

          • 考虑为您的答案添加一些上下文:解释每个部分在做什么,尤其是因为您的答案中有很多代码。另外,我认为您需要修复一些缩进。
          • 缩进方式
          • 缩进是指每行之前的制表符。一般来说,更深层的代码块有更多的缩进。但是,您的答案没有一致的间距。
          • 注意你的间距是如何不一致的。代码应该对齐 - 请参阅其他答案以获取示例。
          猜你喜欢
          • 1970-01-01
          • 2021-12-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-02-22
          • 1970-01-01
          • 2021-06-13
          相关资源
          最近更新 更多