【问题标题】:Merge two int array from one array without duplication从一个数组中合并两个 int 数组而不重复
【发布时间】:2013-12-27 05:35:21
【问题描述】:

我正在尝试将两个数组合并为一个而不重复,但我的代码无法正常工作。谁能建议如何解决这个问题?

void unify(int set_A[], int size_A, int set_B[], int size_B, int set_C[], int size_C)
{
  int i,j,count=0,indx=size_A;
  for(i=0;i<size_A;i++)
  {
    set_C[i]=set_A[i];
  }

  for(i=0;i<size_B;i++)
  {
    for(j=0;j<size_A;j++)
    {
      if (set_B[i]!=set_C[j])
        count++;
    }
    if (count==size_A){
      set_C[indx]=set_B[i];
      indx++;
    }
  }

}

例子:

a{3 7 13 8 11 1 4}
b{5 7 1 2 3}

a_b{3 7 13 8 11 1 4 5 0 0 0 0 0..}

【问题讨论】:

  • 合并后的数组是set_C吗?
  • 是的,数组 a , b 是给定的,array_c 的大小是 a, b 之和
  • for 循环中的 MN 是什么?
  • 数组 c 中的“o”是垃圾值,但我不在乎是否有垃圾值
  • 在哪里声明 M 或 N?

标签: c arrays merge


【解决方案1】:

类似这样的:

void unify(int set_A[], int size_A, int set_B[], int size_B, int set_C[], int size_C)
{
    int counterC = 0;
    for (int i = 0; i < size_A && counterC < size_C; i++)
    {
        int discard = 0;
        for (int j = 0; j < i; j++)
        {
            if (set_A[j] == set_A[i])
            {
                discard = 1;
                break;
            }
        }
        if (discard) continue;
        set_C[counterC++] = set_A[i];
    }

    for (int i = 0; i < size_B && counterC < size_C; i++)
    {
        int discard = 0;
        for (int j = 0; j < i; j++)
        {
            if (set_B[j] == set_B[i])
            {
                discard = 1;
                break;
            }
        }
        if (discard) continue;

        for (int j = 0; j < counterC; j++)
        {
            if (set_C[j] == set_B[i])
            {
                discard = 1;
                break;
            }
        }
        if (discard) continue;


        set_C[counterC++] = set_B[i];
    }
}

【讨论】:

    【解决方案2】:

    我必须对您的代码进行一些小的更正以使其正常工作(未经测试)。注意cmets。

    void unify(int set_A[], int size_A, int set_B[], int size_B, int set_C[]) {
        int i, j, indx = size_A;
    
        // Add the value from A to C
        for(i = 0; i < size_A; i++) {
            set_C[i] = set_A[i];
        }
    
        // Iterate the values of B
        for(i = 0; i < size_B; i++) {
            int count = 0;
    
            // Find if A contains B[i]
            for(j = 0; j < size_A; j++) {
                if (set_A[j] != set_B[i])
                    ++count;
            }
    
            // If A doesn't contain B[i], add B[i] to C and increase indx
            if (count == size_A) {
                set_C[indx] = set_B[i];
                ++indx;
            }
        }
    }
    

    虽然我会用一个函数替换第一个嵌套循环,以告诉我数组是否包含某些值,如下所示:

    int contains(int arr[], int size, int val) {
        int i;
        for(i = 0; i < size; i++) {
            if (arr[i] == val)
                return 0;
        }
    
        return 1;
    }
    

    【讨论】:

    • 如果set_A 有重复项,第一个for 循环将不起作用。 OP 没有提及,但set_A 也可能有重复的键。
    【解决方案3】:

    可能会被优化,或者至少可以变得漂亮:

    void unify(int set_A[], int size_A, int set_B[], int size_B, int set_C[], int size_C)
    {
        int indexC, indexTemp;
    
        for(indexC = 0; indexC < size_A; indexC++)
            set_C[indexC] = set_A[indexC];
    
        for(int indexB = 0; indexB < size_B; indexB++)
        {
            for(indexTemp = 0; indexTemp < indexC; indexTemp++)
            {
                if(set_B[indexB] == set_C[indexTemp])
                    break;
            }
    
            if(indexTemp == indexC)
                set_C[indexC++] = set_B[indexB];
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-07-01
      • 2017-03-20
      • 2017-03-22
      • 1970-01-01
      • 2014-06-29
      • 1970-01-01
      • 2011-06-09
      • 2019-02-22
      相关资源
      最近更新 更多