加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 组合来自2个数组的唯一整数的最快方法

发布时间:2020-12-15 08:47:59 所属栏目:Java 来源:网络整理
导读:如果我有2个数组: arr1 = {9,8}arr2 = {13,12,10,9,8} 我想得到: {13,10} 并给出阵列: arr1 = {23,22,21,20,19,18,17,16}arr2 = {21,17} 结果将是: {23,16} 所以基本上我得到的数字是arr1或arr2,但不是两者. 2个阵列可能有不同的长度. 2个数组按降序排序
如果我有2个数组:

arr1 = {9,8}
arr2 = {13,12,10,9,8}

我想得到:

{13,10}

并给出阵列:

arr1 = {23,22,21,20,19,18,17,16}
arr2 = {21,17}

结果将是:

{23,16}

所以基本上我得到的数字是arr1或arr2,但不是两者.

> 2个阵列可能有不同的长度.
> 2个数组按降序排序,最终数组也必须具有此属性.
>这已经完成了数百万次,所以我试图尽可能地减少/防止对象分配.这就是为什么我不使用套装来完成这项工作.

解决方法

你正在寻找两套的EXOR.由于阵列是预先排序的,我认为这比它看起来更简单.伪代码

  1. compare the first element from each array
  2. if unequal,add the larger one to the unique set
  3. else remove both elements
  4. if you’ve reached the end of one array,add all the elements remaining in the other array to the unique set

这是一个greedy O(n)解决方案.这是一个实施,经过轻微测试:D

/**
 * Returns the sorted EXOR of two sorted int arrays (descending). Uses
 * arrays,index management,and System.arraycopy.
 * @author paislee
 */
int[] arrExor(int[] a1,int[] a2) {

    // eventual result,intermediate (oversized) result
    int[] exor,exor_builder = new int[a1.length + a2.length];
    int exor_i = 0; // the growing size of exor set

    int a1_i = 0,a2_i = 0; // input indices
    int a1_curr,a2_curr; // elements we're comparing

    // chew both input arrays,greedily populating exor_builder
    while (a1_i < a1.length && a2_i < a2.length) {

        a1_curr = a1[a1_i];
        a2_curr = a2[a2_i];

        if (a1_curr != a2_curr) {
            if (a1_curr > a2_curr)
                exor_builder[exor_i++] = a1[a1_i++];
            else
                exor_builder[exor_i++] = a2[a2_i++];
        } else {
            a1_i++;
            a2_i++;
        }        
    }

    // copy remainder into exor_builder
    int[] left = null; // alias for the unfinished input
    int left_i = 0,left_sz = 0; // index alias,# elements left

    if (a1_i < a1.length) {
        left = a1;
        left_i = a1_i;
    } else {
        left = a2;
        left_i = a2_i;
    }

    left_sz = left.length - left_i;
    System.arraycopy(left,left_i,exor_builder,exor_i,left_sz);
    exor_i += left_sz;

    // shrinkwrap and deliver
    exor = new int[exor_i];
    System.arraycopy(exor_builder,exor,exor_i);
    return exor;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读