【问题标题】:merge two array into one将两个数组合并为一个
【发布时间】:2012-11-19 13:11:08
【问题描述】:
    int [] queue1 = {4,7,2,9,12,35,8,49};
    int [] queue2 = {24,53,6,19,41,71,1,68,11,32,99}        
    int[]mergeQ = new int[queue1.length + queue2.length];

    for(int i=0; i < queue1.length; i++ )
    {

      mergeQ[i*2] = queue1[i];       
      mergeQ[i*2+1] = queue2[i];  
    }
    for(int i=0; i < mergeQ.length; i++) {            
        System.out.print(mergeQ[i]+",");
    }

输出:4,24,7,53,2,6,9,19,12,41,35,71,8,1,49,68,0,0,0

如何打印出 queue2 的其余元素。?

【问题讨论】:

  • queue2中没有输入所有数字,所以mergeQ的结尾是0。

标签: java algorithm merge


【解决方案1】:

我不确定是否有任何顺序您希望合并两个队列(例如队列 1 中的一个元素被队列 2 中的一个元素闲置),尽管闲置代码会将所有元素放入合并队列中。

int [] 
    queue1 = {4,7,2,9,12,35,8,49},
    queue2 = {24,53,6,19,41,71,1,68,11,32,99},
    mergeQ = new int[queue1.length + queue2.length];

for (int i=0; i < queue1.length; i++ )
    mergeQ[i] = queue1[i];

for (int i = 0; i < queue2.length; i++)
    mergeQ[queue1.length + i] = queue2[i];

for(int i=0; i < mergeQ.length; i++)
    System.out.print(mergeQ[i]+",");

【讨论】:

  • 现在我觉得不问关于订单的问题很愚蠢......我同意......这是一个更直接的方法
  • 由于mergeQ[queue1.length + i] = queue1[i]; 中的错误,该代码仅从 queue1 复制元素
  • 已修复。对不起。这是一个简单的错字。
【解决方案2】:

您的合并算法假设queue1.length &lt; queue2.length。虽然它对您的程序是正确的,但做出这样的假设通常不是一件好事。

更改合并算法以遍历两个数组,直到达到较短数组的长度,然后将较长数组的剩余元素转储到合并数组的尾部。您可以在一个循环中完成所有操作,如下所示:

int p = 0;
for (int i = 0 ; i < queue1.length || i < queue2.length ; i++) {
    if (i < queue1.length) {
        mergeQ[p++] = queue1[i];
    }
    if (i < queue2.length) {
        mergeQ[p++] = queue2[i];
    }
}

【讨论】:

    【解决方案3】:

    这是一种方法:

        int[] queue1 = { 4, 7, 2, 9, 12, 35, 8, 49 };
        int[] queue2 = { 24, 53, 6, 19, 41, 71, 1, 68, 11, 32, 99 };
        int[] mergeQ = new int[queue1.length + queue2.length];
    
        int dest = 0;
        int src1 = 0;
        int src2 = 0;
        while (src1 < queue1.length || src2 < queue2.length) {
            if (src1 < queue1.length) {
                mergeQ[dest++] = queue1[src1++];
            }
            if (src2 < queue2.length) {
                mergeQ[dest++] = queue2[src2++];
            }
        }
    
        for (int i = 0; i < mergeQ.length; i++) {
            System.out.print(mergeQ[i] + ",");
        }
    

    无论queue1queue2 是否更短,这都有效。

    它还保留了算法的属性,即两个队列的元素是交错的。如果这不重要,那么整个事情可以通过两次调用 System.arraycopy() 来代替。

    【讨论】:

      【解决方案4】:
      int[] queue1 = {4,7,2,9,12,35,8,49};
      int[] queue2 = {24,53,6,19,41,71,1,68,11,32,99}        
      int[] mergeQ = new int[queue1.length + queue2.length
      
      int i=0;
      for(; i < queue1.length; i++ ){
        mergeQ[i*2] = queue1[i];       
        mergeQ[i*2+1] = queue2[i];
      }
      if(queue1.length>queue2.length){ 
       for(int j=i;j<queue1.length;j++)
        mergeQ[j+2] = queue1[j];
      }else if(queue1.length<queue2.length){
       for(int j=i;j<queue2.length;j++)
        mergeQ[j+2] = queue2[j];
      }
      

      【讨论】:

        【解决方案5】:

        检查哪个数组更长。为两者之间的差异保留一个计数器。稍微改一下代码……有点不正统……但更干净一点

        int [] queue2 = {24,53,6,19,41,71,1,68,11,32,99};
        
        int[]mergeQ = new int[queue1.length + queue2.length];
        
        int larger=queue1.length;
        int smaller=queue2.length;
        
        if(queue1.length < queue2.length)
          {
           larger=queue2.length;
           smaller=queue1.length;
          }
        
            for(int i=0; i < queue1.length; i++ )
            {
              mergeQ[i*2] = queue1[i];       
              mergeQ[i*2+1] = queue2[i];
        
            }
        
            for(int i=mergeQ.length; i < queue2.length; i++ )
            {
               mergeQ[i] = queue2[larger-smaller];
               smaller++;
            }
        
            for(int i=0; i < mergeQ.length; i++){
        
        
                System.out.print(mergeQ[i]+",");
            }
        

        这应该会为你做的

        【讨论】:

          【解决方案6】:

          输入:{1, 3, 5, 7} 和 {2, 4, 6} 输出:{1、2、3、4、5、6、7}}

                  int c[] = {2, 4, 6, 8};
                  int n[] = {1, 3, 5, 7, 9};
                  int f = 0;
                  int res[] = new int[c.length + n.length];
                  for(int i=0;i<(c.length + n.length); i++)
                  {
                      if(c.length > n.length)
                      {
                          if(i<c.length)
                              res[f++] = c[i];
                          else if(f<=res.length-1)
                              res[f++] = c[i];
          
                          if(i<n.length)
                          res[f++] = (char) n[i];
                      }else{
                          if(i<n.length)
                              res[f++] = n[i];
                          else if(f<=res.length-1)
                              res[f++] = n[i];
          
                          if(i<c.length)
                          res[f++] = (char) c[i];
                      }
          
                  }
                  for(int i=0;i<res.length;i++)
                  {
                      System.out.print("   "+res[i]);
                  }
              }
          }
          

          【讨论】:

          • 不鼓励代码转储。对你所做的一些解释将使 OP 受益 - 特别是如果他或她是初学者。解释也阻止了简单的复制和粘贴,而不了解你做了什么。
          猜你喜欢
          • 2021-07-16
          • 1970-01-01
          • 2019-08-30
          • 2011-06-02
          • 2022-01-10
          • 2014-05-14
          • 1970-01-01
          • 2023-03-26
          相关资源
          最近更新 更多