2017-02-17 5 views
-3

2つの配列をJavascriptで交差させる適切な方法はありますか?

私は2つのアレイに正しい方法に交差するようにしようとしていますが、私はここに Simplest code for array intersection in javascript2つの配列を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

また

/** 
 
* @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
:また、これを試してみました 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) { 
 
    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

そしてはその回答からアルゴリズムことを試してみました

ここで私は間違っていますか?

+1

私はわかりませんどのような目的あなたの質問のeです。あなたはどんな答えを期待していますか?あなたは人々にこれらの実装のそれぞれを "修正"したいですか? –

+0

すべてのテストケースを通過する完璧なアルゴリズムを見つけようとしています – Microsmsm

+1

"交差"とはどういう意味ですか? 2つの配列のすべての値を1つの配列に結合するか、または両方の配列のすべての固有の値を新しい単一の配列にコピーすることを意味しますか? – Pytth

答えて

1
/** 
* @param {number[]} nums1 
* @param {number[]} nums2 
* @return {number[]} 
*/ 
var intersect = function(nums1, nums2) { 
    var arr = [], ind; 
    while (nums1.length) { 
     ind = nums2.indexOf(nums1.shift()); 
     if (ind > -1) { 
      arr.push(nums2.splice(ind, 1)[0]); 
     } 
    } 
    return arr; 
}; 
+0

完璧で分かりやすい! – Microsmsm

+0

あなたは 'nums2'を削除しています。 –

+0

@NinaScholzはい、nums2を削除したくない場合は、そのコピーを作成することができます。 'copy2 = nums2.slice(0)' – zakariamouhid

1

Mapを使用して、フィルタリングで見つかった場合はカウントを減らすことができます。

var intersect = function(nums1, nums2) { 
 
    var m = new Map(); 
 
    
 
    nums1.forEach(a => m.set(a, (m.get(a) || 0) + 1)); 
 
    return nums2.filter(a => m.get(a) && m.set(a, m.get(a) - 1)); 
 
}; 
 

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

+0

最後のものは '[1、1]'を返すべきです。どちらの配列も* 2 * '1'を含みます。 –

+0

少し説明できますか? – Microsmsm

+0

基本的に、値が「0」でない場合は、すべての要素とフィルタの数が必要です。カウントを減らします。それ以外の場合は 'Array#filter'に対してfalseを返します。 –

0

つ以上の実装、あなたのアプローチ1を使用したが、使用して重複を削除ES 6 Set

/** 
 
    * @param {number[]} nums1 
 
    * @param {number[]} nums2 
 
    * @return {number[]} 
 
    */ 
 
    var intersect = function(nums1, nums2) { 
 
     var result = nums1.filter(x => nums2.includes(x)); 
 
     return [...new Set(result)]; 
 
    }; 
 

 
    console.log(intersect([1, 2], [1, 1])); //[1] correct 
 
    console.log(intersect([1, 1], [1, 2])); //[1] correct 
 
    console.log(intersect([1], [1, 1])); //[1] correct 
 
    console.log(intersect([1, 1, 1], [1, 1])); //[1] correct 
 
    console.log(intersect([1, 45, 143, 76, 11], [761,76, 11, 1])); //[1,76,11] correct

+0

'[1,1,1]、[1,1]は' [1,1] 'を返します。 – Microsmsm

+0

あなたの交差点の論理は何ですか? – Agalo

+0

結果の各要素は、両方の配列に表示されている回数だけ表示されます。 – Microsmsm

関連する問題