var arr1 = [1,2,3,4,5,6,7] var arr2 = [3,5,7,9,12,14]
Suchen Sie das zusammengeführte Array aus zwei Arrays, nachdem Sie doppelte Elemente entfernt haben (bezieht sich auf das Löschen der doppelten Elemente auf beiden Seiten. Wenn beispielsweise 3 wiederholt wird, darf das Ergebnis keine 3 enthalten, was sich von der Array-Deduplizierung unterscheidet), d. h. die Vereinigung minus der Schnittmenge des Array-Teils, ich weiß nicht, ob dieser Teil einen mathematischen Namen hat. Suchen Sie einen Algorithmus mit geringerer zeitlicher Komplexität?
用 set 做索引再遍历较短的 O(n)
求两个集合不重合的部分,可以先求两个集合的并集,然后去掉公共的元素。
A∪B - A∩B = { x | (x∈A & x∉B) || (x∉A & x∈B) }
用程序的思路来实现是:
对两个数组合并,然后使用filter方法过滤掉数组a和b中的交集元素。将a.concat(b)中在a不在b中和在b不在a中的元素过滤出来。主要会涉及到数组中是否含有某个元素的判断,有Array.prototype.indexOf,Set的has方法,Array.prototype.includes三种实现方式。
利用ES5的indexOf方法在不考虑NaN情况下的实现方法:
利用ES6新增的Set集合方法,结合filter方法对合并的数组进行过滤。
利用ES7新增的Array.prototype.includes数组方法,用于返回一个数组是否包含指定元素,结合filter方法对合并的数组进行过滤。
這個結果叫symmetric difference, 在set或multiset上都有定義
複雜度..一般就
O(n)
了----------看错问题了,答案有误,上面的只是去重了,看下面-------------
----------基础的for循环遍历一下就能搞定---------------
第一种方法,for
第二种,concat和filter,原理就是合并再去重
利用对象的性质实现
ScreenShot