给定两个数组,用一个函数计算两个数组的交集。让num1=[1,2,2,1];让num2=[2,2];//find[2,2]letnum1=[4,9,5];letnum2=[9,4,9,8,4];//find[4,9]方法1存储一个哈希表自同一个数字可能在两个数组中出现多次,需要用哈希表记录每个数字出现的次数。对于同一个数,它在交集出现的次数等于该数在两个数组中出现的最小次数。首先遍历第一个数组,并在哈希表中记录第一个数组中的每一个数和对应的出现次数,然后遍历第二个数组,对于第二个数组中的每一个数,如果在哈希表中存在该数哈希表,将数字添加到答案中并减少哈希表中数字的出现次数。为了降低空间复杂度,先遍历较短的数组并在哈希表中记录每个数和对应的出现次数,然后遍历较长的数组求交集。constintersect=(num1,num2)=>{constmap={};constres=[];for(constn1ofnum1){//保存num1出现的次数if(map[n1]){map[n1]++;}else{地图[n1]=1;}}for(constn2ofnum2){//遍历num2,看num1中是否出现过数字constval=map[n2];if(val>0){//Res.push(n2)出现了;//推送res数组map[n2]--;//如果匹配到一个,则缺少一个}}returnres;};运行结果:letnum1=[1,2,2,1];letnum2=[2,2];console.log(相交(num1,num2));//[2,2]方法二双指针方法如果两个数组是有序的,可以很方便的计算出两个数组的交集。先把两个数组排序,然后用两个指针遍历两个数组。最初,两个指针分别指向两个数组的头部。每次比较两个指针所指向的两个数组中的数,如果两个数不相等,则将指向较小数的指针右移一位,如果两个数相等,则将该数加到answer,并且两个指针都向右移动一位。当至少有一个指针超出数组边界时,遍历结束。constintersect=(num1,num2)=>{num1.sort((a,b)=>a-b);num2.sort((a,b)=>a-b);//先排序,使重复出现的元素相邻constres=[];让p1=0;//两个指针letp2=0;while(p1
