原题出处:350. 两个数组的交集 II - 力扣(LeetCode)
解法一:
public static int[] intersect(int[] nums1, int[] nums2) {
int length2;
boolean flag = false;
StringBuilder value = new StringBuilder();
if (nums1.length < nums2.length) {
length2 = nums2.length;
flag = true;
} else if (nums1.length == nums2.length) {
length2 = nums2.length;
} else {
length2 = nums1.length;
}
if (flag) {
int[] a1 = new int[length2];
Arrays.fill(a1, -1);
for (int item : nums1) {
for (int j = 0; j < nums2.length; j++) {
if (item == nums2[j]) {
if (a1[j] == -1 && a1[j] != nums2[j]) {
a1[j] = item;
break;
}
}
}
}
for (int i = 0; i < a1.length; i++) {
if (a1[i] == nums2[i]) {
value.append(nums2[i]).append(",");
}
}
} else {
int[] a2 = new int[length2];
Arrays.fill(a2, -1);
for (int item : nums2) {
for (int j = 0; j < nums1.length; j++) {
if (item == nums1[j]) {
if (a2[j] == -1 && a2[j] != nums1[j]) {
a2[j] = item;
break;
}
}
}
}
for (int i = 0; i < a2.length; i++) {
if (a2[i] == nums1[i]) {
value.append(nums1[i]).append(",");
}
}
}
int[] result = new int[0];
if (!"".equals(value.toString())) {
value = new StringBuilder(value.substring(0, value.length() - 1));
String[] split = value.toString().split(",");
result = new int[split.length];
for (int i = 0; i < split.length; i++) {
result[i] = Integer.parseInt(split[i]);
}
}
return result;
}
思路:如果两个数组的长度是一样的且让两个数组的元素在同位置上,那么就好办了,只需要将每一个位置上的元素进行比较,相等的元素抽取出来,那么两个集合的交集就出来了,
我们再想一下,如果这两个数组的长度永远是一样的,那么集合的交集也就出来了,但事实是,集合元素的长度是不确定的,那么我们就想办法把这两个数组的长度设置为一样的就好了,所以我们先需要得出两个数组长度哪一个长,哪一个短,把“”短的变成长的“
,定义一个数组,长度与“长的“数组一样长,在将数组赋值(都赋值为一个在集合中不会出现的值,以免出现冲突),再将“原来短的数组和长的数组“双循环,短的在外长的在里,短的校验长的每一个元素,将第一个相等的元素赋值到新建的数组中(此时数组的下标就在当前长的数组下标)
注意在赋值时应当判断赋值新数组需与之前赋值的不存在的元素值相等,否则就会出现相同元素判断错误的问题,做完这一系列操作后,我们就得到了一个和“长数组“长度一样的“短数组”,而且短数组中只有与“长数组”相同位置元素相等的数组,其他位置的元素都通过不存在的值进行填充。
在比较这两个“长度相等的数组“,将元素追加到字符串中,在切割字符串,集合就出来了。