数组的交集和数组找不同

有2个大小不同的数组,找出2个数据的交集,输出的交集可以有重复数字。
解决方法:先将2个数组排序,然后同时从头开始遍历2个数组,如果存在相同的元素,则输出到结果数组中,直至遍历完成其中一个数组。

public int[] test(int[] a,int[] b){
	    int lena = a.length;
	    int lenb = b.length;
	    //首先将a、b数组排序
	    sort(a);
	    sort(b);
	    int len = 0;
	    if(lena > lenb){
	    	len = lenb;
	    } else {
	    	len = lena;
	    }
	    //取a、b数组长度最小的值,按照这个值准备一个临时数组
	    int[] tmp = new int[len];
	    int count = 0;
	    int i = 0;
	    int j = 0;
	    //同时遍历2个数组
	    while(i < lena && j < lenb){
	    	//如果元素相同,将相同的值存到临时数组
	    	if(a[i] == b[j]){
	    		tmp[count] = a[i];
	    		count++;
	    		i++;
	    		j++;
	    	} else if(a[i] > b[j]){
	    		j++; //如果a数组的值较大,则向后遍历b数组
	    	} else {
	    		i++; //如果b数组的值较大,则继续向后遍历a数组
	    	}
	    }
	    int[] dest = new int[count];
	    //创建结果数组,删除临时数组的空元素
	    for(int k=0; k<count; k++){
	        /*如果不允许输出重复数字,可以增加判断来处理*/
	        //if(k > 0 && tmp[k] != tmp[k - 1]){dest[k] = tmp[k]}
	    	dest[k] = tmp[k];
	    }
	    return dest;
}

有2个数组都是有序的,其中一个数组仅比另一个数组多一个数字,其他数字完全相同,找出这个数字的位置。

	static void merge(int[] n,int[] res){
		int i = n.length;
		int j = res.length;
		if(n[0] != res[0]){
		    System.out.println("index=="+0);
		    return;
		}
		int k = 0;
		//找出其中比较小的数组,以小数组的长度为准进行遍历数组
		if(i < j){
    		if(n[i - 1] != res[j - 1]){
	    	    System.out.println("index=="+(j - 1));
	    	    return;
		    }
			k = i;
		} else {
			if(n[i - 1] != res[j - 1]){
    		    System.out.println("index=="+(i - 1));
    		    return;
	    	}
			k = j;
		}

		int low = 0;
		int high = k - 1;
		//计算数组的中间位置
		int middle = (low + high) / 2;
		//开始二分法遍历数组
		while(low <= middle && middle <= high){
			if(n[middle] == res[middle]){
				//如果2个数组的元素相同,则继续向右边查找
				low = middle + 1;
			} else {
			    //如果2个数组的元素不同,则继续向左查找
				high = middle - 1;
			}
			//计算新的分段数组的中间位置
			middle = low + (high - low) / 2;
		}
        //输出查找到的多余元素的位置
		System.out.println("index=="+middle);

	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值