有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);
}