【发布时间】:2017-02-17 19:50:11
【问题描述】:
有没有合适的方法在 Javascript 中相交两个数组?
我试图以正确的方式使两个数组相交,但我发现了一些困难
我的输入未按此处假设的方式排序 Simplest code for array intersection in javascript
我的代码:
/**
* @param {number[]} nums1
* @param {number[]} nums2
* @return {number[]}
*/
var intersect = function(nums1, nums2) {
var t, a = nums1,b = nums2;
if (b.length > a.length) t = b, b = a, a = t;
return a.filter(x => b.includes(x))
};
console.log(intersect([1, 2], [1, 1])); //[1] correct
console.log(intersect([1, 1], [1, 2])); //[1,1] wrong
console.log(intersect([1], [1, 1])); //[1,1] wrong
console.log(intersect([1, 1, 1], [1, 1])); //[1,1,1] wrong
并从该答案中尝试了该算法: Finding the intersection of two arrays in Javascript
/**
* @param {number[]} nums1
* @param {number[]} nums2
* @return {number[]}
*/
var intersect = function(nums1, nums2) {
var A=nums1,B=nums2;
var m = A.reduce(function(m, v) { m[v] = 1; return m; }, {});
return B.filter(function(v) { return m[v]; });
};
console.log(intersect([1, 2], [1, 1])); //[1,1] wrong
console.log(intersect([1, 1], [1, 2])); //[1] right
console.log(intersect([1], [1, 1])); //[1,1] wrong
console.log(intersect([1, 1, 1], [1, 1])); //[1,1] right
/**
* @param {number[]} nums1
* @param {number[]} nums2
* @return {number[]}
*/
var intersect = function(nums1, nums2) {
return nums1.filter((n) => nums2.indexOf(n) !== -1);
};
console.log(intersect([1, 2], [1, 1])); //[1] right
console.log(intersect([1, 1], [1, 2])); //[1,1] wrong
console.log(intersect([1], [1, 1])); //[1] right
console.log(intersect([1, 1, 1], [1, 1])); //[1,1,1] wrong
/**
* @param {number[]} nums1
* @param {number[]} nums2
* @return {number[]}
*/
var intersect = function(nums1, nums2) {
var a = nums1,b=nums2;
var ai=0, bi=0;
var result = [];
while( ai < a.length && bi < b.length )
{
if (a[ai] < b[bi] ){ ai++; }
else if (a[ai] > b[bi] ){ bi++; }
else /* they're equal */
{
result.push(a[ai]);
ai++;
bi++;
}
}
return result;
};
console.log(intersect([1, 2], [1, 1])); //[1] right
console.log(intersect([1, 1], [1, 2])); //[1] right
console.log(intersect([1], [1, 1])); //[1] right
console.log(intersect([1, 1, 1], [1, 1])); //[1] right
console.log(intersect([2,1],[1,1])); //[] wrong
我错在哪里了?
【问题讨论】:
-
我不确定你的问题的目的是什么。你期待什么样的答案?您希望人们“修复”这些实现中的每一个吗?
-
“相交”是什么意思?你的意思是将两个数组的所有值合并到一个数组中,还是将两个数组的所有唯一值复制到一个新的单个数组中,还是什么?
-
为什么
intersect([1, 1, 1], [1, 1])应该产生[1,1]?如果我们真的要删除重复项,那不应该返回[1]吗? -
是的,我在问为什么。在你弄清楚如何之前,你需要准确地解释what你在做什么。而且我认为这些测试用例还不够。
标签: javascript algorithm