求只有a中函数有的元素而b中没有的元素,只有b中含有的元素而a中没有的元素
题目:给定两个数组:求只有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) {
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<>(); 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 ++; } }
|