我们有两个Numbers数组,我们需要编写一个函数cross()来计算它们的交集,并返回一个包含任意顺序的相交元素的数组。结果中的每个元素应出现在两个数组中的次数相同。
如果输入为-
arr1 = ['hello', 'world', 'how', 'are', 'you']; arr2 = ['hey', 'world', 'can', 'you', 'rotate'];
那么输出应该是-
['world', 'you'];
如果对数组进行了排序,我们可以使用双指针方法,最初都将两个指针指向各自数组的开始,并且可以继续增加对应的指针,这将是O(m + n)复杂wrt时间,其中m和n是数组的大小。
但是因为我们有未排序的数组,所以在对数组进行排序然后再使用这种方法时没有逻辑,因此我们将检查first的每个值是否与Second的每个值并构造一个交集数组。
这将花费我们O(n ^ 2)的时间。
因此,让我们为该函数编写代码-
为此的代码将是-
arr1 = ['hello', 'world', 'how', 'are', 'you']; arr2 = ['hey', 'world', 'can', 'you', 'rotate']; const intersectElements = (arr1, arr2) => { const res = []; const { length: len1 } = arr1; const { length: len2 } = arr2; const smaller = (len1 < len2 ? arr1 : arr2).slice(); const bigger = (len1 >= len2 ? arr1 : arr2).slice(); for(let i = 0; i < smaller.length; i++) { if(bigger.indexOf(smaller[i]) !== -1){ res.push(smaller[i]); bigger.splice(bigger.indexOf(smaller[i]), 1, undefined); } }; return res; }; console.log(intersectElements(arr1, arr2));
输出结果
控制台中的输出将为-
[ 'world', 'you' ]