public class intersect {
public static void find(int[] a, int[] b, int[] acc)
{
int position = 0;
for (int j = 0; j < a.length; j++) {
for (int k = 0; k<b.length; k++) {
if (a[j] == b[k]) {
acc[position] = b[k];
position++;
}
}
}
System.out.println(java.util.Arrays.toString(acc));
}
public static void main (String[] s)
{
int[] acc = new int[2];
int[] a = {1,2,3};
int[] b = {2,3,4};
find(a, b, acc);
}
}
我已经编写了上面的代码来解决这个问题。 但是如果你看,这个功能非常有限,因为我每次都要改变acc的长度。这意味着我必须知道有多少元素相交。在这种情况下,数组{1,2,3}和{2,3,4}共有{2,3},因此acc的长度为2。
我确信有数百种方法可以解决这个问题,但我似乎无法想出解决这个问题的方法。
请帮忙!
答案 0 :(得分:1)
如果您的教授希望您使用数组,则可以使用以下方法:
public static int[] resize(int[] arr)
{
int len = arr.length;
int[] copy = new int[len+1];
for (int i = 0; i < len; i++)
{
copy[i] = arr[i];
}
return copy;
}
这会将数组的大小增加1.您可以使用它。顺便说一句,您没有使用他们在find()
方法中排序的事实。你应该做的是:
public static void find(int[] a, int[] b, int[] acc)
{
int a_index = 0, b_index = 0, acc_index = -1;
int a_element, b_element;
while (a_index < a.length && b_index < b.length)
{
a_element = a[a_index]; b_element = b[b_index];
if (a_element == b_element)
{
acc = resize(acc);
acc[++acc_index] = a_element;
a_index++; b_index++;
} else if (b_element < a_element) {
b_index++;
} else {
a_index++;
}
}
System.out.println(java.util.Arrays.toString(acc));
}
此方法现在效率更高。 Working example
答案 1 :(得分:0)
使您的交集数组的大小与原始数组中较小的一样。这样,你就不可能增加它的容量。
然后,您可以使用Arrays.copy
将结果转换为适当大小的数组。
答案 2 :(得分:0)
不确定这是否是最佳解决方案,但您不需要提前对交叉点的大小进行硬编码(这是您关注的一件事)。
当您遍历两个数组时,可以将两个集合中找到的元素添加到StringBuilder(以及一些分隔符,我在下面的示例中使用了逗号)。完成后,您可以致电toString()
&amp;然后split()
使用分隔符获取String []。此时,您可以将这些String对象转换为int基元和&amp;返回一个int []。
public class Scratch {
public static void main(String[] s) {
int[] a = {1, 2, 3};
int[] b = {2, 3, 4};
int[] intersection = findIntersection(a, b);
System.out.println(Arrays.toString(intersection));
}
public static int[] findIntersection(int[] a, int[] b) {
StringBuilder intersectionStringBuilder = new StringBuilder();
for (int j = 0; j < a.length; j++) {
for (int k = 0; k < b.length; k++) {
if (a[j] == b[k])
intersectionStringBuilder.append(a[j] + ",");
}
}
String[] intersectionStringArray = intersectionStringBuilder.toString().split(",");
int[] intersection = new int[intersectionStringArray.length];
for (int current = 0; current < intersectionStringArray.length; current++) {
intersection[current] = Integer.parseInt(intersectionStringArray[current]);
}
return intersection;
}
}
答案 3 :(得分:0)
要找到2个排序数组的交集,请按照以下方法进行操作:
1)使用两个索引变量i和j,初始值为0 2)如果array1小于array2,则递增i。 3)如果array1大于array2,则递增j。 4)如果两者相同,则打印其中任何一个,并同时增加i和j。
检查此链接以获取更多信息
https://www.geeksforgeeks.org/union-and-intersection-of-two-sorted-arrays-2/
public class FindIntersection {
static void findInterSection(int array1[], int array2[], int array1NoOfElements, int
array2NoOfElements) {
int i = 0, j = 0;
while (i < array1NoOfElements && j < array2NoOfElements) {
if (array1[i] < array2[j]) {
i++;
} else if (array2[j] < array1[i]) {
j++;
}
// if both array elements are same
else {
System.out.println(array2[j++] + " ");
i++;
}
}
}
public static void main(String[] args)
{
int myFirstArray[] = { 1, 2, 4, 5, 5 };
int mySecondArray[] = { 2, 3, 5, 7 };
int m = myFirstArray.length;
int n = mySecondArray.length;
findInterSection(myFirstArray, mySecondArray, m, n);
}
}
答案 4 :(得分:0)
for(int i=0;i<arr1.length;i++){
for(int j=0;j<arr2.length;j++){
if(arr1[i]==arr2[j] && !index.contains(j)){
list.add(arr1[i]);
index.add(j);
break;
}
}
}
int result[]=new int[list.size()];
int k=0;
for(int i:list){
result[k]=i;
k++;
}
for(int i=0;i<result.length;i++){
System.out.println(result[i]);
}
return result;
}