第 59 题:给定两个数组,写一个方法来计算它们的交集

发布于 2022-05-26 12:08:42 字数 383 浏览 680 评论 59

例如:给定 nums1 = [1, 2, 2, 1],nums2 = [2, 2],返回 [2, 2]。

var nums1 = [1, 2, 2, 1], nums2 = [2, 2, 3, 4];
// 1.
// 有个问题, [NaN].indexOf(NaN) === -1
var newArr1 = nums1.filter(function(item) {
     return nums2.indexOf(item) > -1;
});
console.log(newArr1);
// 2.
var newArr2 = nums1.filter((item) => {
     return nums2.includes(item);
});
console.log(newArr2);

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(59

忆离笙 2022-05-04 13:56:37
function getCommon(arr1, arr2){
  const obj = {}
  const res = []
  for(let v of arr1){
    obj[v] ? obj[v]++ : obj[v] = 1
  }
  for(let v of arr2){
    if(obj[v]){
      res.push(v)
      obj[v]--
    }
  }
  return res
}
归属感 2022-05-04 13:56:37
// 先将两个数组进行排序,然后使用双指针p1和p2判断当前数字是否相等,若相等,则加入结果数组,两个指针都前进一格
// 若p1指向的数字 < p2,则移动p1
// 反之移动p2
var intersection = function(nums1, nums2) {
    nums1.sort((x, y) => x - y)
    nums2.sort((x, y) => x - y)
    const l1 = nums1.length
    const l2 = nums2.length
    let p1 = p2 = 0
    const res = []
    let pre
    while (p1 < l1 && p2 < l2) {
        if (nums2[p2] === nums1[p1]) {
                // 若要求结果数组去重,则需要记录一个pre,每次结果数组压入值时判断是否与pre相同
                res.push(nums1[p1])
            }
            p1 ++
            p2 ++
        } else if (nums1[p1] < nums2[p2]) {
            p1 ++
        } else {
            p2 ++
        }
    }
    return res
};
皓月长歌 2022-05-04 13:56:37
function common(arr1, arr2) {
        const record = {};
        let res = [],
            len1 = arr1.length,
            len2 = arr2.length;
        let tmp = len1 > len2 ? arr2 : arr1;
        for (let item of tmp) {
            if (record[item]) {
                record[item] += 1;
            }
            else {
                record[item] = 1;
            }
        }
        let tmp2 = tmp === arr1 ? arr2 : arr1;
        for (let item of tmp2) { 
            if (record[item] > 0) {
                res.push(item);
                record[item] -= 1;
            }
        }
        return res;
    }
无畏u。 2022-05-04 13:56:37
var nums1 = [1], nums2 = [1, 1]

const intersect = (arr1, arr2) => {
  let x = 0, y = 0, result = []

  arr1.sort((a, b) => a - b)
  arr2.sort((a, b) => a - b)

  while(x < arr1.length && y < arr2.length) {
    if (arr1[x] === arr2[y]) {
      result.push(arr1[x])
      x++
      y++
    } else if (arr1[x] < arr2[y]) {
      x++
    } else {
      y++
    }
  }

  return result
}

intersect(nums1, nums2)
戴着白色围巾的女孩 2022-05-04 13:56:37
export default (arr1, arr2) => {
  let len1 = arr1.length;
  let len2 = arr2.length;

  const map = new Map();
  const res = [];
  if (len1 > len2) {
    const tempArr = arr1;
    arr1 = arr2;
    arr2 = tempArr;
    len1 = arr1.length;
    len2 = arr2.length;
  }
  for (let i = 0; i < len1; i++) {
    console.log(map);
    if (map.has(arr1[i])) {
      const temp = map.get(arr1[i]) + 1;
      map.set(arr1[i], temp);
    } else {
      map.set(arr1[i], 1);
    }
  }
  // console.log(map);
  for (let i = 0; i < len2; i++) {
    if (map.has(arr2[i])) {
      res.push(arr2[i]);
      const tempCount = map.get(arr2[i]) - 1;
      if (tempCount === 0) {
        map.delete(arr2[i]);
      } else {
        map.set(arr2[i], tempCount);
      }
    }
  }
  return res;
};
故事还在继续 2022-05-04 13:56:37

const intersection = (...arg) => {
return arg[0].filter((item, index) => {
const res = arg[1].indexOf(item);
if(res > -1) {
arg[1].splice(res, 1);
}
return res > -1;
})
};

祁梦 2022-05-04 13:56:37
function intersection(a,b){
        const res= []
        const [min,max] = a.length > b.length ? [b,a] : [a,b]
        // 那个参数短 那么设置这个长度为min 减少循环次数
        while (min.length){ // min还有长度
            const item = min.shift() // 弹出第一个值
            const index = max.indexOf(item) // 查询弹出的值在另一个数组的索引
            if(index !== -1){ // 如果查询到下标
                max.splice(index,1) // 在另一个数组中删除查询到的这一项
                res.push(item) // 推送到返回值中
            }
        }
        return res
    }
神经大条 2022-05-04 13:56:37
        var arr1 = [1,2,2,1]
        var arr2 = [2,2]
        var map = {}

        arr1.forEach(item => map[item] ? map[item]++ : map[item] = 1)
        var result = arr2.filter(item => {
            if(map[item]){//非undefined,非0
                map[item] --;
                return true
            }
        })

        console.log(result)// [2, 2]
动听の歌 2022-05-04 13:56:37
let temp = [...num2]
let array = num1.filter((aItem) => {
    return temp.some((bItem, bIndex) => {
        if (bItem === aItem) {
            temp.splice(bIndex, 1)
            return true
        } else {
            return false
        }
    }) 
})

// const num1 = [1, 2, 2, 1]
// const num2 = [2, 2]

// var num1 = [1]
// var num2 = [1,1]

// var num1 = [1,1]
// var num2 = [1]

// var num1 = [61,24,20,58,95,53,17,32,45,85,70,20,83,62,35,89,5,95,12,86,58,77,30,64,46,13,5,92,67,40,20,38,31,18,89,85,7,30,67,34,62,35,47,98,3,41,53,26,66,40,54,44,57,46,70,60,4,63,82,42,65,59,17,98,29,72,1,96,82,66,98,6,92,31,43,81,88,60,10,55,66,82,0,79,11,81]
// var num2 = [5,25,4,39,57,49,93,79,7,8,49,89,2,7,73,88,45,15,34,92,84,38,85,34,16,6,99,0,2,36,68,52,73,50,77,44,61,48]

测试用例通过

你的他你的她 2022-05-04 13:56:37
function isEX(arr_1,arr_2) {
    let list = []
    let clone_arr = []
    for(var i = 0; i < arr_1.length; i++){
        clone_arr = arr_2
        if(clone_arr.length > 0){
            for(var j = 0; j < clone_arr.length; j++) {
                if(arr_1[i] === clone_arr[j]) {
                    list.push(arr_1[i])
                    arr_2.splice(j,1)
                    break
                }
            }            
        }
        else break
    }
    return list
}

hhh 脑子里第一时间想到了这个

栖竹 2022-05-04 13:56:37

function getRes(a,b) {
let res = []
for(let i = 0; i < a.length; i++) {
b.indexOf(a[i]) > -1 && res.push(a[i]) && b.splice(b.indexOf(a[i]), 1);
}
return res;
}

や三分注定━ 2022-05-04 13:56:37

const intersection = (aArray, bArray) => {
const bArraySet = new Set(bArray);
const resultArray = aArray.filter(item => bArraySet.has(item));
return Array.from(resultArray);
}

猥琐帝 2022-05-04 13:56:37

function commonArray(m, n) {
if (m.length <= n.length) {
return m.filter((v) => n.indexOf(v) !== -1);
} else {
return n.filter((v) => m.indexOf(v) !== -1);
}
}

半岛未凉° 2022-05-04 13:56:37
function test(a1, a2) {
    let min = a1.length > a2.length ? a2 : a1;
    let max = a1.length > a2.length ? a1 : a2;
    return min.filter(i => max.includes(i))
}
因为看清所以看轻 2022-05-04 13:56:37

可以用Set
数组求交集:
let result = [...new Set(arr)].filter( item => new Set(arr2).has(item));
数组求并集:
let union = [...new Set([...arr,...arr2])]
数组求差集:
let diff = [...new Set(arr)].filter( item => !(new Set(arr2).has(item)));

指尖上的星空〃 2022-05-04 13:56:37
let nums2 = [1,1];
const nums2String = nums2.toString()

let result = []
let lastArr = []

for (let i=0;i<nums1.length;i++) {
  lastArr = []
  for (let j=i;j<nums1.length;j++) {
    const num = nums1[j]
    lastArr.push(num)
    if (!nums2String.includes(lastArr.toString()) || lastArr.length <= result.length) {
      break
    }
    result = [...lastArr]
  }
}


console.log(result)
混浊又暗下来 2022-05-04 13:56:37
let arr = [1,2,2,1],arr2 = [1,2];
function interSection(arr1,arr2) {
     let result = [];
     let a = arr1.length > arr2.length?arr1:arr2;    //长数组
     let b = arr1.length < arr2.length?arr1:arr2;    //短数组
     let len = arr1.length < arr2.length?arr1.length:arr2.length;    //短数组的长度
     for(let i=0;i<len;i++) {
          let index = a.indexOf(b[i]);
          if(index !== -1) {
              result.push(a[index])   //将交集添加到结果数组
              a.splice(index,1)   //从长数组中剔除找到的元素
           }
     }
     return result;
 }
console.log(interSection(arr,arr2));   //[1,2]
console.log(interSection([1,1],[1]));   //[1]
陪我终i 2022-05-04 13:56:37

传入两个数组,支持引用类型和NaN,使用map
利用引用计数,复杂度O(n)?

const calcArrayIntersection = (arr1,arr2)=>{
    const intersectionMap = new Map();
    const intersectionArr = [];

    arr1.forEach((item)=>{
        const count = intersectionMap.get(item);
        if (!count) {
            intersectionMap.set(item, 1);
        } else {
            intersectionMap.set(item, count + 1);
        }
    }
    );

    arr2.forEach((item)=>{
        const count = intersectionMap.get(item);
        if (count) {
            intersectionArr.push(item);
            intersectionMap.set(item, count - 1);
        }
    }
    );

    return intersectionArr;
}

console.log(calcArrayIntersection([1, 1], [1]));
console.log(calcArrayIntersection([1], [1, 1]));
console.log(calcArrayIntersection([1, 2, 2, 1], [2, 2]));
console.log(calcArrayIntersection([61, 24, 20, 58, 95, 53, 17, 32, 45, 85, 70, 20, 83, 62, 35, 89, 5, 95, 12, 86, 58, 77, 30, 64, 46, 13, 5, 92, 67, 40, 20, 38, 31, 18, 89, 85, 7, 30, 67, 34, 62, 35, 47, 98, 3, 41, 53, 26, 66, 40, 54, 44, 57, 46, 70, 60, 4, 63, 82, 42, 65, 59, 17, 98, 29, 72, 1, 96, 82, 66, 98, 6, 92, 31, 43, 81, 88, 60, 10, 55, 66, 82, 0, 79, 11, 81], [5, 25, 4, 39, 57, 49, 93, 79, 7, 8, 49, 89, 2, 7, 73, 88, 45, 15, 34, 92, 84, 38, 85, 34, 16, 6, 99, 0, 2, 36, 68, 52, 73, 50, 77, 44, 61, 48]));

丢了幸福的猪 2022-05-04 13:56:37

不会算法的我流下了泪水。交集就是你有我也有没错昂。

let arr1 = [1,1,2,3,2], arr2= [2,2,3,4];
let arr = [];
arr1.forEach((item,i) => {
    if(arr2.indexOf(item) > -1) {
        arr = arr.concat(arr2.splice(arr2.indexOf(item),1))
    }
})
console.log(arr)
塔塔猫 2022-05-04 13:56:37

下面都是代码,格式不太会搞。。。

时间复杂度为On(n是较短数组的长度)

function fn(arr1, arr2) {
if (!arr1 && !arr2) return
if (!(arr1 instanceof Array) || !(arr2 instanceof Array)) return

  let data1, data2
  arr1.length < arr2.length ? (data1 = arr1, data2 = arr2) : (data1 = arr2, data2 = arr1)

  let i, index
  for (i = 0; i < data1.length; i++) {
    index = data2.indexOf(data1[i])
    if (index == -1) {
      data1.splice(index, 1)
      i--
    } else {
      data2.splice(index, 1)
    }
  }

  return data1
}
沫离伤花 2022-05-04 13:56:37

根据上面 Molunerfinn 的回答,给我很有用的帮助,学到了!!!

解法1:不会出错

let arr1 = [1, 1, 8, 9, 14, 78, 6, '5'];
let arr2 = [1, 1, 8, 5, 6, 48, 21];

let result = [];
for (let i = 0; i < arr1.length; i++) {
  for (let j = 0; j < arr2.length; j++) {
    if(arr1[i] === arr2[j]) {
      if (!result.includes(arr1[i])) {
        result.push(arr1[i])
      }
    };
  }
}
console.log(result);  // [1, 8, 6]

解法2:有缺陷,纯数字和字符串类型数字无法区分

let result1 = []
let obj = {};
for (let i = 0; i < arr1.length; i++) {
  obj[arr1[i]] = arr1[i]
}
for (let j = 0; j < arr2.length; j++) {
  if(obj[arr2[j]] && !result1.includes(arr2[j])) {
    result1.push(arr2[j])
  };
}
console.log(result1); // [1, 8, 5, 6]
洋洋洒洒 2022-05-04 13:56:37
function same(arr1, arr2) {
  let set = new Set()
  let res = []
  for (let i = 0; i < arr1.length; i++) {
    set.add(arr1[i])
  }
  for (let j = 0; j < arr2.length; j++) {
    if (set.has(arr2[j])) {
      res.push(arr2[j])
    }
  }
  return res
}
初心未许 2022-05-04 13:56:37
function intersection(arr1, arr2) {
	if (!arr2.length || !arr1.length) return []
	const arr = []

	const len1 = arr1.length
	const len2 = arr2.length

	let i = 0, j = 0

	while (i < len1 && j < len2) {
		if (arr1[i] === arr2[j]) {
			arr.push(arr1[i])
			i++
			j++
		} else {
			if (arr1[i+1] === arr2[j] && i !== len1 - 1 && arr1[i+1] !== undefined) {
				i++
			} else if (arr1[i] === arr2[j+1] && j !== len2 - 1 && arr[j+1] !== undefined) {
				j++
			} else {
				if (i < len1) {
					i++
				} else if (j < len2) {
					j++
				}
			}
		}
	}

	return arr
}

const result = intersection([1, 2, 2, 1], [2, 2])

console.log('result', result)
执妄 2022-05-04 13:56:36

这道题不是工程题,是道算法题。求的是两个数组的最长公共子序列。所以上面用一个filter一个includes或者indexOf的都是错的。

反例很简单。

var nums1 = [1]
var nums2 = [1,1]

或者

var nums1 = [1,1]
var nums2 = [1]

最长公共子序列应该是[1]

跑一下你们的方法就能知道错了。

我试了 可以啊

 const a = [1]
 const b = [1, 1]

function fn(arr1, arr2) {
   return arr1.filter(item => {
      return arr2.includes(item)
   })
}

 console.log(fn(a, b))//[1]
兲鉂ぱ嘚淚 2022-05-04 13:56:36

/* 第 59 题:给定两个数组,写一个方法来计算它们的交集。

例如:给定 nums1 = [1, 2, 2, 1],nums2 = [2, 2],返回 [2, 2]。 */

// 思路:遍历数组1,对每个元素判断其是否在数组2中,存在则提出来放到一个新数组里,并且从数组2中剔除,以确保下一次遍历不会出现重复的。
// 由于Array.splice()函数效率比较低,所以采用空间换取时间的方式,剔除的过程是将其他非交集元素放到新数组里。
// 想了想,还是用简单的splice吧。

function intersect (ary1, ary2) {
  let longAry, shortAry
  // 不取长短数组也行吧。
  if (ary1.length > ary2.length) {
    longAry = ary1
    shortAry = ary2
  } else {
    longAry = ary2
    shortAry = ary1
  }
  let tmpAry = []
  try {
    longAry.forEach(el => {
      if (shortAry.length === 0) {
        throw new Error('short array.lenth === 0')
      }
      let index = shortAry.indexOf(el)
      if (index > -1) {
        // 短数组中存在元素的情况
        shortAry.splice(index, 1)
        tmpAry.push(el)
      }
    })
  } catch (error) {
    console.log(error)
  }
  return tmpAry
}
console.log(intersect([1, 2, 2, 1], [2, 2]))
霓裳挽歌倾城醉 2022-05-04 13:56:36

这道题不是工程题,是道算法题。求的是两个数组的最长公共子序列。所以上面用一个filter一个includes或者indexOf的都是错的。
反例很简单。

var nums1 = [1]
var nums2 = [1,1]

或者

var nums1 = [1,1]
var nums2 = [1]

最长公共子序列应该是[1]
跑一下你们的方法就能知道错了。

我试了 可以啊

 const a = [1]
 const b = [1, 1]

function fn(arr1, arr2) {
   return arr1.filter(item => {
      return arr2.includes(item)
   })
}

 console.log(fn(a, b))//[1]

你的a换成[1,1],b换成[1]再试试

转身泪倾城 2022-05-04 13:56:36

这道题不是工程题,是道算法题。求的是两个数组的最长公共子序列。所以上面用一个filter一个includes或者indexOf的都是错的。
反例很简单。

var nums1 = [1]
var nums2 = [1,1]

或者

var nums1 = [1,1]
var nums2 = [1]

最长公共子序列应该是[1]
跑一下你们的方法就能知道错了。

我试了 可以啊

 const a = [1]
 const b = [1, 1]

function fn(arr1, arr2) {
   return arr1.filter(item => {
      return arr2.includes(item)
   })
}

 console.log(fn(a, b))//[1]

你的a换成[1,1],b换成[1]再试试

是有问题。有受到调用数组长度影响。

謌踐踏愛綪 2022-05-04 13:56:36

不会受到长度影响

let intersection = (...arg) => {
  let result = [];
  arg[0].forEach((v) => {
    if (arg[1].indexOf(v) !== -1) {
      result.push(v); 
      arg[1].splice(arg[1].indexOf(v), 1);
    }
  }); return result;
}
糖粟与秋泊 2022-05-04 13:56:36

` /**
@info: 给定 nums1 = [1, 2, 2, 1],nums2 = [2, 2],返回 [2, 2]。
*/
var nums1 = [1,1];
var nums2 = [1];
function common(nums1,nums2) {
var resp = [];
nums1.forEach(ele => {
let idx = nums2.indexOf(ele);
if(idx > -1) {
resp.push(ele);
nums2.splice(idx, 1)
}
})
return resp
}

console.log(common(nums1,nums2))`
神回复 2022-05-04 13:56:36
/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number[]}
 */
var intersect = function(nums1, nums2) {
  nums1.sort((a, b) => a - b)
  nums2.sort((a, b) => a - b)
  let arr = []
  let i = 0
  let j = 0
  while (i < nums1.length && j < nums2.length) {
    if (nums1[i] == nums2[j]) {
      arr.push(nums1[i])
      i++
      j++
    } else if (nums1[i] > nums2[j]) {
      j++
    } else {
      i++
    }
  }
  return arr
}
扎心 2022-05-04 13:56:36

不会受到长度影响

let intersection = (...arg) => {
  let result = [];
  arg[0].forEach((v) => {
    if (arg[1].indexOf(v) !== -1) {
      result.push(v); 
      arg[1].splice(arg[1].indexOf(v), 1);
    }
  }); return result;
}

不错,个人感觉要是能在不改变原数组的基础上实现就更好了

十雾 2022-05-04 13:56:36

你们上面都不对,这个才是正确的。
时间复杂度 O(n)

let insertSection = (...args) => {
  let [ first, second ] = args
  let res = []
  while (first.length) {
    let item = first.pop()  
    let index = second.indexOf (item)
    if (index > -1) {
      second.splice(index, 1)
      res.push(item)
    }
  }
  return res
}

// test
var nums1 = [1]
var nums2 = [1,1]

var res = insertSection(nums1, nums2)
console.log(res) // [1]

var nums1 = [2, 2, 1], nums2 = [1 , 2, 2, 3, 4];

var res2 = insertSection(nums1, nums2)
console.log(res2) // [1, 2, 2]
葬シ愛ベ 2022-05-04 13:56:36

你们上面都不对,这个才是正确的。
时间复杂度 O(n)

let insertSection = (...args) => {
  let [ first, second ] = args
  let res = []
  while (first.length) {
    let item = first.pop()  
    let index = second.indexOf (item)
    if (index > -1) {
      second.splice(index, 1)
      res.push(item)
    }
  }
  return res
}

// test
var nums1 = [1]
var nums2 = [1,1]

var res = insertSection(nums1, nums2)
console.log(res) // [1]

var nums1 = [2, 2, 1], nums2 = [1 , 2, 2, 3, 4];

var res2 = insertSection(nums1, nums2)
console.log(res2) // [1, 2, 2]

这是O(m,n)复杂度吧

荆棘i 2022-05-04 13:56:36
function findTheSameNumber(nums1, nums2) {
  const res = [];

  for (let i = 0; i < nums1.length; i++) {
    if (nums2.length <= 0) {
      break;
    }

    const val = nums1[i];

    const index = nums2.indexOf(val);

    if (index > -1) {
      nums2.splice(index, 1);
      res.push(val);
    }
  }

  return res;
}

const nums1 = [1, 2, 2, 1];
const nums2 = [2, 2];

console.log(findTheSameNumber(nums1, nums2));
段念尘 2022-05-04 13:56:36

你们上面都不对,这个才是正确的。
时间复杂度 O(n)

let insertSection = (...args) => {
  let [ first, second ] = args
  let res = []
  while (first.length) {
    let item = first.pop()  
    let index = second.indexOf (item)
    if (index > -1) {
      second.splice(index, 1)
      res.push(item)
    }
  }
  return res
}

// test
var nums1 = [1]
var nums2 = [1,1]

var res = insertSection(nums1, nums2)
console.log(res) // [1]

var nums1 = [2, 2, 1], nums2 = [1 , 2, 2, 3, 4];

var res2 = insertSection(nums1, nums2)
console.log(res2) // [1, 2, 2]

emmm。。你这个也是n方的解法。你先是一层循环,里面用了indexOf和splice,然后indexof和splice都是O(n)

愛放△進行李々 2022-05-04 13:56:36

function intersect(m,n){
return new Set(m).size<=new Set(n).size?n.filter(x=>new Set(m).has(x)):m.filter(x=>new Set(n).has(x))
}
console.log(intersect([1, 2, 2, 1],[2, 2, 1]))

console.log(intersect([1,1],[1,2]))

孤独患者 2022-05-04 13:56:36
function getIntersection(nums1,nums2){
    let data1 = nums1.length > nums2.length ? nums1 : nums2
    let data2 = nums1.length > nums2.length ? nums2 : nums1
    let result = [];
    data2.forEach(item => {
        if(data1.indexOf(item) !== -1) {
            result.push(item)
           data1.splice(data1.indexOf(item),1)
        }
    })
    console.log(result)
    return result;
}
太傻旳人生 2022-05-04 13:56:36

function intersect(m,n){
return m.length>n.length ?n.filter(x=>new Set(m).has(x)):m.filter(x=>new Set(n).has(x))
}
console.log(intersect([1, 2, 2, 1],[2, 2, 1]))

测试用例console.log(intersect([1,1],[1,2])) 输出应该是[1], 但你的是[1,1]

不如归去 2022-05-04 13:56:36
function intersect(m,n){
	let sortedM = m.sort((a,b)=>a-b);
	let sortedN = n.sort((a,b)=>a-b)
	const mLength = m.length;
	const nLength = n.length;
	const intersection = []
	while(sortedM.length&&sortedN.length){
		const a = sortedM[0];
		const b = sortedN[0];
		if(a>b){
			sortedN.shift();
		}
		else if (a<b){
			sortedM.shift();
		}
		else{
			intersection.push(sortedM.shift());
			sortedN.shift();
		}
	}
	return new Set(intersection);
}
源来凯始玺欢你 2022-05-04 13:56:36

O(min(n,m))
function intersect(m,n){ let sortedM = m.sort((a,b)=>a-b); let sortedN = n.sort((a,b)=>a-b) const mLength = m.length; const nLength = n.length; const intersection = [] while(sortedM.length&&sortedN.length){ const a = sortedM[0]; const b = sortedN[0]; if(a>b){ sortedN.shift(); } else if (a<b){ sortedM.shift(); } else{ intersection.push(sortedM.shift()); sortedN.shift(); } } return new Set(intersection); }

你sort一下就已经是O(n lgn)了。。

若言繁花未落 2022-05-04 13:56:36

O(min(n,m))
function intersect(m,n){ let sortedM = m.sort((a,b)=>a-b); let sortedN = n.sort((a,b)=>a-b) const mLength = m.length; const nLength = n.length; const intersection = [] while(sortedM.length&&sortedN.length){ const a = sortedM[0]; const b = sortedN[0]; if(a>b){ sortedN.shift(); } else if (a<b){ sortedM.shift(); } else{ intersection.push(sortedM.shift()); sortedN.shift(); } } return new Set(intersection); }

你sort一下就已经是O(n lgn)了。。

Damn... 已修改

烟─花易冷﹏ 2022-05-04 13:56:36

大佬们 我这样对不对

function fn(a, b) {
    const result = [];
    const map = a.reduce((obj, item) => {
        obj[item] ? obj[item]++ : obj[item] = 1;
        return obj;
    }, {});
    b.forEach(item => {
        if (map[item] && map[item] > 0) {
            result.push(item);
            map[item]--
        }
    })
    return result
}
console.log(fn([1, 2, 1], [2, 2, 1])) // [2, 1]
谜兔 2022-05-04 13:56:36

哈希表,时间复杂度O(m + n) m为nums1长度,n为nums2长度

const intersect = (nums1, nums2) => {
  const map = {}
  const res = []
  for (let n of nums1) {
    if (map[n]) {
      map[n]++
    } else {
      map[n] = 1
    }
  }
  for (let n of nums2) {
    if (map[n] > 0) {
      res.push(n)
      map[n]--
    }
  }
  return res
}

intersect(['1', 1, 2], ['1', '2']) // 输出 ['1', '2']

宁愿没拥抱 2022-05-04 13:56:36

采用hash的话, 个人觉得不好区分数字1和字符串1,除非提前限定好数组值的类型。两个循环时间复杂度确实很差, 不过优点是可以区分数字和字符串。去重这一步估计还要额外增加复杂度

function intersection(arr1, arr2) {
	if (!arr1 || !arr2) {
		return []
	}
	const ret = []
	for (let i = 0, len = arr1.length; i < len; i++) {
		for (let j = 0, len3 = arr2.length; j < len3; j++) {
			if (arr1[i] === arr2[j]) {
				ret.push(arr1[i])
			}
		}
	}
	return Array.from(new Set(ret))
}
走野 2022-05-04 13:56:36
function fn(arr1 = [], arr2 = []){
    const obj = {};
    const res = [];
    arr1.forEach(item => {
        if(obj[item] === undefined){
              obj[item] = 1;  
        }else {
              obj[item]++;
        }
    })
    arr2.forEach(item => {
        if(obj[item] !== undefined && obj[item] > 0){
            res.push(item);
            obj[item]--;
        }
    })
    return res;
};
console.log(fn([1, 2, 2, 1], [2,2])); // [2, 2]
console.log(fn([1,1], [1])); // [1]
console.log(fn([1], [1,1])); // [1]
残月升风 2022-05-04 13:56:36
const run = (nums1, nums2) => {
  const set = new Set(nums1)
  return nums2.filter((item) => set.has(item))
}
请你别敷衍ら 2022-05-04 13:56:36

暴力一点吧。

var intersect = function(nums1, nums2) {
    let result = [];
    for(let i = 0; i < nums1.length; i++) {
        for(let j = 0; j < nums2.length; j++) {
            if(nums1[i] == nums2[j]) {      
                nums2.splice(j,1);
                result.push(nums1[i]);
                break;
            }
        }
    }
    return result;
}
故人如初 2022-05-04 13:56:35
let intersection = (...arg) => arg[0].filter(v => arg[1].includes(v));

[1,2,2,1],[2] 情况不成立

慵挽 2022-05-04 13:56:34
let arr0 = [1, 2, 3, '5', '你好啊', 7],
    arr1 = [2, 7, 9, 3, 'hello', '你好啊', 120];
    

const dorseyHandle = (arr0, arr1) => {

    let res = [],
        map = {},
        _arr1;

    //  确定哪个数组长度更长
    let _arr0 = arr0.length > arr1.length ? ( _arr1 = arr1, arr0 ) : ( _arr1 = arr0 , arr1 );    //  这里是arr0更长

    _arr0.map(( item, index ) => {

        map[item] = 'undefined' !== typeof map[item] ? map[item] + 1 : 1;
    });

    _arr1.forEach(item => {

        if('undefined' !== typeof map[item]){

            res.push(item);

            map[item] === 1 ? delete map[item] : map[item] -= 1;

        }
    });

    return res;
}

console.log(dorseyHandle(arr0, arr1));

另一种方式

    let arr0 = [1, 2, 3, '5', '你好啊', 7],
        arr1 = [2, 7, 9, 3, 'hello', '你好啊', 120];

    const dorseyHandle = ( arr0, arr1 ) => {


        return arr0.filter( item => {

            let index = arr1.indexOf(item);

            if(-1 !== index){

                arr1.splice(index, 1);
                return item;
            }
        });
    }

    console.log(dorseyHandle(arr0, arr1));
左耳近心 2022-05-04 13:56:34

哈希表,时间复杂度O(m + n) m为nums1长度,n为nums2长度

const intersect = (nums1, nums2) => {
  const map = {}
  const res = []
  for (let n of nums1) {
    if (map[n]) {
      map[n]++
    } else {
      map[n] = 1
    }
  }
  for (let n of nums2) {
    if (map[n] > 0) {
      res.push(n)
      map[n]--
    }
  }
  return res
}
黑色毁心梦 2022-05-04 13:56:29
    let nums1 = [1, 2, 2, 1], nums2 = [2, 2, 1, 3]
    let result = nums1.filter(item => {
        let idx = nums2.indexOf(item)
        if (idx !== -1) {
            nums2.splice(idx, 1)
            return item
        }
    })
    console.log(result)  //[1, 2, 2]
一个人练习一个人 2022-05-04 13:56:26

这道题不是工程题,是道算法题。求的是两个数组的最长公共子序列 (子序列要求顺序,交集不需要)。所以上面用一个filter一个includes或者indexOf的都是错的。

反例很简单。

var nums1 = [1]
var nums2 = [1,1]

或者

var nums1 = [1,1]
var nums2 = [1]

交集应该是[1]

跑一下你们的方法就能知道错了。

这道题两种思路,空间换时间,或者不用额外空间就提升时间复杂度。

空间换时间的思路是用个Hash表来存数组1的元素以及出现的个数(此处需要遍历n次,并存一个n级别的空间)。
遍历数组2,发现数组2里有Hash表里的值就存到Result数组里,并把Hash表内该值次数减一(为0之后就Delete)。如果不存在Hash表里,就跳过。这样时间复杂度就是(m+n)

不用额外空间,就用遍历n的时候,判断值在不在m里,如果在,把m里的该值push到Result数组里,并将该值从m数组里删掉(用splice)。这样就是不用额外空间,但是提高了时间复杂度。

﹏雨一样淡蓝的深情 2022-05-04 13:56:22

返回所有符合结果的交集。

function isExsitWith(numGroup1, numGroup2) {

	let betterArray = [];

	let eachCode = []
	numGroup1.forEach(val=>{

		eachCode.push(val);
		if(numGroup2.toString().indexOf(eachCode.toString()) == -1) {
			eachCode.pop()
			eachCode.length > 1 && betterArray.push(eachCode)
			eachCode = []
		}

	})

	return betterArray;
}

console.log(
	isExsitWith([1, 2, 2, 1, 1, 9, 9, 6, 1, 1, 2, 3, 3], [2, 2, 9, 9, 6,])
)
睫毛上残留的泪 2022-05-04 13:56:19
const nums1 = [1, 2, 2, 1];
const nums2 = [2, 2];

const nums = nums1.filter(v => nums2.some(w => w === v))
console.log(nums)

之前的错了,更新一下,感觉可以

const nums1 = [1, 2, 2, 1];
const nums2 = [2, 2];

const doit = (array1, array2) => {
    const tmp = [...array2]; // 避免修改array2,使函数doit变得纯洁
    return array1.filter(v => {
        const index = tmp.indexOf(v);
        if(index > -1) {
            tmp.splice(index, 1);
            return true;
        } 
        return false;
    })
}

console.log(doit(nums1, nums2))
苍景流年 2022-05-04 13:29:15
let intersection = (...arg) => arg[0].filter(v => arg[1].includes(v));

解法有点问题,intersection([1,2,2,1],[2,1])

江湖正好 2022-05-04 13:10:00
function union (arr1, arr2) {
  return arr1.filter(item => {
  	return arr2.indexOf(item) > - 1;
  })
}
 const a = [1, 2, 2, 1];
 const b = [2, 3, 2];
 console.log(union(a, b)); // [2, 2]
我恋#小黄人 2022-05-04 12:37:12
var nums1 = [1, 2, 2, 1], nums2 = [2, 2], result=[];
nums1.forEach(function(val) {
	if(nums2.includes(val)) {
		result.push(val);
	}
})
console.log(result);
困倦 2022-05-04 11:15:46
let intersection = (...arg) => arg[0].filter(v => arg[1].includes(v));
~没有更多了~

关于作者

怎会甘心

暂无简介

0 文章
0 评论
23 人气
更多

推荐作者

linfzu01

文章 0 评论 0

可遇━不可求

文章 0 评论 0

枕梦

文章 0 评论 0

qq_3LFa8Q

文章 0 评论 0

JP

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文