【问题标题】:How do I merge two arrays into a singular array in an alternating order in C?如何在C中以交替顺序将两个数组合并为一个奇异数组?
【发布时间】:2020-07-09 20:35:09
【问题描述】:

我想我快要完成这个计划了,但我不完全确定如何继续。

基本上,我有三个数组。数组 3 为空,数组 1 和数组 2 的值由用户自行决定。我想将数组 1 和数组 2 合并到数组 3 中,使它们在数组 3 中的偶数和奇数位置之间交替。

所以,例如:

数组 1 = [1,2,3,4,5]

数组 2 = [10,20,30,40,50]

数组 3 = [0,0,0,0,0,0,0,0,0,0]

我希望最终结果如下所示:

数组 3 = [1,10,2,20,3,30,4,40,5,50]

这就是我说我希望数组 1 填充 奇数值,而数组 2 填充 偶数值时的意思。

这就是我目前所拥有的相关代码的样子:

void EvenOdd(int n, int *ap1, int *ap2, int *ap3) {
  // "n" is set to 5.
  ap1 = arr1;
  ap2 = arr2;
  ap3 = arr3;
  int i;
  int j;
  int k;
  for (i = 0; i < n * 2; i++) {
    for (j = 0; j < n; j++) {
      if ((i + 1) % 2 != 0)
        ap3[i] = ap1[j];
    }
    for (k = 0; k < n; k++) {
      if ((i + 1) % 2 == 0)
        ap3[i] = ap2[k];
    }
  }
}

arr1、arr2、arr3都是全局数组。

每次我运行程序时,它只会将数组 1 和数组 2 的最后一个值分配给数组 3 中的位置,如下所示:

数组 1 = [1,2,3,4,5]

数组 2 = [6,7,8,9,10]

数组 3 = [5,10,5,10,5强>,10,5,10,5,10]

这一切都向我表明,第一个内部的两个 for 循环一直运行“i”,直到它们每次都到达数组的末尾,这就是为什么最后一个值被一致分配的原因,但我不是确定如何解决这个问题以获得预期的结果。

【问题讨论】:

  • 你有嵌套循环。内部循环一遍又一遍地分配给a[i],因此只有最后一个值“坚持”。你不需要嵌套循环来解决这个问题。想想如何获得i-th 奇数和i-th 偶数索引。

标签: c arrays algorithm loops


【解决方案1】:

我会选择这样的东西

void EvenOdd(int n, int*ap1, int*ap2, int*ap3){
// "n" is set to 5.
    ap1=arr1;
    ap2=arr2;
    ap3=arr3;
    int i;
    for(int i = 0; i < 2 * n; i++)
    {
        if(i%2)
            {
                *ap3= *ap2;
                ap1++;
            }
        else
            {
                *ap3= *ap1;
                ap2++;
            }
        ap3++;
    }
}

【讨论】:

    【解决方案2】:

    问题:

    这就是我说我希望数组 1 填充奇数值的意思,并且 数组2填充偶数

    实际上,在索引的情况下,array1 填充偶数索引,array2 填充奇数索引。幸运的是,您的代码在这方面有效,因为您检查的是 i + 1 的奇偶性,而不是 i

    每次我运行程序时,它只分配 Array 的最后一个值 1 和 Array 2 到 Array 3 中的位置,像这样:

    i-loop 负责填充目标数组。但是你还有另外两个嵌套在其中的循环,它们一遍又一遍地重写ap[i],并使用ap1ap2 的偶数和奇数索引中的值。 ap[i] 中保留的最后一个值是 j-loop 和 k-loop 结束的时间。这就是为什么,您会看到从 ap1ap2 的末尾开始在 ap3 中填充重复的值。

    解决方案:

    您只需要一个 i-loop 在检查 i 的奇偶校验后填充目标数组。

    for (int i = 0; i < 2 * n; ++i)
        ap3[i] = i % 2 ? ap2[i / 2] : ap1[i / 2];
    

    【讨论】:

      【解决方案3】:

      另一种方法是

      #include <stdio.h>
      
      void EvenOdd(int n, int *ap1, int *ap2, int *ap3) {
        for (int i = 0; i < 2 * n; i++)
          if(i % 2 == 0)
            ap3[i] = ap1[i / 2];
          else
            ap3[i] = ap2[i / 2];
      }
      
      int main() {
        int arr1[5] = {1, 2, 3, 4, 5};
        int arr2[5] = {10, 20, 30, 40, 50};
      
        int arr[10];
      
        EvenOdd(5, arr1, arr2, arr);
      
        for (int i = 0; i < 10; i++)
          printf("%d ", arr[i]);
      
        return 0;
      }
      

      输出

      1 10 2 20 3 30 4 40 5 50 
      
      

      【讨论】:

        【解决方案4】:

        你可以这样做:

        int ap1[5] = {1, 2, 3, 4, 5};
        int ap2[5] = {10, 20, 30, 40, 50};
        int ap3[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
        
        int j = 0;
        int k = 0;
        for (int i = 0; i < 10; i++) {
            if (i % 2 != 0) { // if i is odd
                ap3[i] = ap2[j++]; // set ap3 to jth value in ap2; j becomes j+1
            } else { // if i is even
                ap3[i] = ap1[k++]; // likewise, but ap1 and k becomes k+1
            }
        }
        
        for (int i = 0; i < 10; i++) {
            printf("%d ", ap3[i]);
        }
        

        输出是1 10 2 20 3 30 4 40 5 50

        您的问题是嵌套循环是不必要的,并且实际上会在您不希望它们时重写值。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-12-01
          • 2023-01-12
          • 2020-01-03
          • 1970-01-01
          • 2021-07-16
          • 1970-01-01
          相关资源
          最近更新 更多