-
Notifications
You must be signed in to change notification settings - Fork 3.3k
第 59 题:给定两个数组,写一个方法来计算它们的交集。 #102
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
|
var nums1 = [1, 2, 2, 1], nums2 = [2, 2], result=[];
nums1.forEach(function(val) {
if(nums2.includes(val)) {
result.push(val);
}
})
console.log(result); |
|
解法有点问题,intersection([1,2,2,1],[2,1]) |
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)) |
返回所有符合结果的交集。 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,])
) |
这道题不是工程题,是道算法题。 反例很简单。 var nums1 = [1]
var nums2 = [1,1] 或者 var nums1 = [1,1]
var nums2 = [1] 交集应该是[1] 跑一下你们的方法就能知道错了。 这道题两种思路,空间换时间,或者不用额外空间就提升时间复杂度。 空间换时间的思路是用个 不用额外空间,就用遍历n的时候,判断值在不在m里,如果在,把m里的该值push到 |
|
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)); |
哈希表,时间复杂度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
} |
[1,2,2,1],[2] 情况不成立 |
我试了 可以啊 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] |
/* 第 59 题:给定两个数组,写一个方法来计算它们的交集。 例如:给定 nums1 = [1, 2, 2, 1],nums2 = [2, 2],返回 [2, 2]。 */ // 思路:遍历数组1,对每个元素判断其是否在数组2中,存在则提出来放到一个新数组里,并且从数组2中剔除,以确保下一次遍历不会出现重复的。
|
你的a换成[1,1],b换成[1]再试试 |
是有问题。有受到调用数组长度影响。 |
不会受到长度影响 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;
} |
` /**
|
/**
* @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
} |
不错,个人感觉要是能在不改变原数组的基础上实现就更好了☺ |
你们上面都不对,这个才是正确的。 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)复杂度吧 |
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)); |
emmm。。你这个也是n方的解法。你先是一层循环,里面用了indexOf和splice,然后indexof和splice都是O(n) |
function intersect(m,n){ console.log(intersect([1,1],[1,2])) |
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;
} |
测试用例 |
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... 已修改 |
大佬们 我这样对不对 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] |
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] |
// const num1 = [1, 2, 2, 1] // var num1 = [1] // var num1 = [1,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] 测试用例通过 |
hhh 脑子里第一时间想到了这个 |
function getRes(a,b) { |
const intersection = (aArray, bArray) => { |
function commonArray(m, n) { |
|
可以用Set |
|
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] |
传入两个数组,支持引用类型和NaN,使用map
|
不会算法的我流下了泪水。交集就是你有我也有没错昂。
|
下面都是代码,格式不太会搞。。。时间复杂度为On(n是较短数组的长度)function fn(arr1, arr2) {
|
根据上面 Molunerfinn 的回答,给我很有用的帮助,学到了!!! 解法1:不会出错
解法2:有缺陷,纯数字和字符串类型数字无法区分
|
|
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) |
根据Molunerfinn 大神给的思路 |
const nums1 = [1, 2, 2, 1, 3, 5, 'as', '娱乐'] |
const intersection = (itemListA, itemListB) => {
// convert to map
const mapA = new Map();
itemListA.forEach(key => {
if (mapA.has(key)) {
mapA.set(key, mapA.get(key) + 1);
} else {
mapA.set(key, 1);
}
});
const intersectionList = [];
itemListB.forEach(key => {
if (mapA.has(key) && mapA.get(key) > 0) {
intersectionList.push(key);
const value = mapA.get(key);
mapA.set(key, value - 1);
}
});
return intersectionList;
}
const nums1 = [1, 2, 2, 1], nums2 = [2, 2, 2, 1, 1, 1];
const interList = intersection(nums1, nums2);
console.log(interList); |
根据提示我写出了自己的答案,欢迎指出问题谢谢
|
const test = (arr1: any, arr2: any) => { |
思路:取交集,如果在nums2中找到同样的元素,得把此元素从nums2中剔除,以防下次又匹配成功。 function common(nums1, nums2) {
let result = []
nums1.forEach(item => {
nums2.indexOf(item) !== -1 && result.push(...nums2.splice(nums2.indexOf(item), 1))
})
return result
}
const res = common([1,2,2,1], [2,2])
console.log(res) |
|
function intersection(array1, array2) {
/**
* 创建 need 遍历第一个数组生成需要对比的数据和数量
* 创建 box 为交集
*/
const need = new Map();
const box = new Map();
array1.forEach(item => {
need.set(item, (need.get(item) ?? 0) + 1);
});
for (let index = 0; index < array2.length; index++) {
const item = array2[index];
/**
* 遍历第二个数组
* 如果当前元素出现在第一个数组中 && 并且已有交集中的元素数量小于第一个数组中的数量
* 则向交集中插入当前元素 数量为之前元素数量 + 1 如果之前没有则置为1
*/
if (need.has(item) && need.get(item) > (box.get(item) ?? 0)) {
box.set(item, (box.get(item) ?? 0) + 1);
}
}
const result = [];
box.forEach((itemQuantity, item) => {
result.push(...new Array(itemQuantity).fill(item));
});
return result;
}
intersection([1, 2, 2, 1], [2, 2]); |
let nums1 = [1, 2, 2, 1, 3, 8] |
function intersection(nums1, nums2) {
|
前面确实有问题num1=[1,1],num2=[1]得到[1,1],后面应该计算num1中的相同值个数来保证交集个数。 |
|
if (nums1.length > nums2.length) [nums1, nums2] = [nums2, nums1];
const res = [];
nums1.map((num) => {
if (nums2.includes(num)) res.push(num);
});
console.log(res); |
/**
* 获取数组的交集
* @param {...Array} arrays
*/
function intersection(...arrays) {
if (!arrays || arrays.length === 0) {
return [];
}
if (arrays.length === 1) {
return arrays[0];
}
const arrayToMap = (array = []) => {
const map = new Map();
for (const val of array) {
map.has(val) ? map.set(val, map.get(val) + 1) : map.set(val, 1);
}
return map;
}
let res = arrays[0];
for (let i = 1; i < arrays.length; i++) {
const tmp = [];
const resMap = arrayToMap(res);
for (const val of arrays[i]) {
const count = resMap.get(val);
if (count && count > 0) {
tmp.push(val);
resMap.set(val, count - 1);
}
}
res = tmp;
}
return res;
}
console.log(intersection([1,2,2,1], [2, 2, 2])); |
The text was updated successfully, but these errors were encountered: