CrazyJums LeetCode and Pary For Good Job

题目:给定两个数组:求只有a中函数有的元素而b中没有的元素,只有b中含有的元素而a中没有的元素

1 解题思路

这道题和LeetCode中的一个到题很像,349. 两个数组的交集,只是这里要求两个数组中互相没有的元素。思路:排序+双指针。

先给两个数组进行排序,然后定义两个指针,分别指向两个数组的开头位置,从开头开始遍历:

  • 如果两个元素相等,则指针后移,
  • 如果不相等,
    • 如果$a[l1]<b[l2]$,则判断$a[l1]$是否在$b$中,如果不在,则将$a[l1]$的值添加到结果集中,并$l1++$,如果在跳过
    • 如果$a[l1]>b[l2]$,则判断$b[l2]$是否在$a$中,如果不在,则将$b[l1]$的值添加到结果集中,并$l2++$,如果在跳过
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
public void twoArray(int[] a, int[] b) {
// int[] a = {3,4,1,2,4,4,4,5};
// int[] b = {5,6,3,4,5,5,5};
Arrays.sort(a);
Arrays.sort(b);

List<Integer> res1 = new ArrayList<>();
List<Integer> res2 = new ArrayList<>();

int l1 = 0;
int l2 = 0;
List<Integer> same = new ArrayList<>(); //记录a和b的相同元素
while (l1 < a.length && l2 < b.length) {
if (a[l1] == b[l2]) {
same.add(a[l1]);
l1 ++;
l2 ++;
} else {
if (a[l1] < b[l2]) {
if (res1.size() == 0 || !same.contains(a[l1])) {
res1.add(a[l1]);
}
l1 ++;
} else {
if (res2.size() == 0 || !same.contains(b[l2])) {
res2.add(b[l2]);
}
l2 ++;
}
}
}

while (l1 < a.length) {
if (!same.contains(a[l1]))
res1.add(a[l1]);
l1 ++;
}
while (l2 < b.length) {
if (!same.contains(b[l2]))
res2.add(b[l2]);
l2 ++;
}
}

评论