javascript找到对称差异

时间:2016-01-04 01:56:04

标签: javascript algorithm

我的函数需要接受任意数量的列表,然后输出它们的对称差异。 DELETE FROM `table` WHERE id NOT IN = (SELECT FLOOR( MAX(id) * RAND()) FROM `table` ); 应该返回sym([1, 2, 3], [5, 2, 1, 4])[3, 5, 4]。我对代码的结果感到困惑 - 这会返回一个空数组。

sym([1, 2, 5], [2, 3, 5], [3, 4, 5]) should return [1, 4, 5]

3 个答案:

答案 0 :(得分:2)

已编辑:添加一些代码 您的循环变量都是全局变量,包括i。在他们面前加var(至少在i之前),你已经完成了。

以下是两个集的对称差异。我希望你能从那里开始。

function isin(num,arra)
{
  for (var i=0; i<arra.length; i++)
  {
    if (num == arra[i]){return true;}
  }
  return false;
}

function sym() 
{
   var j,k,i,l;
   var syms = [];
   for ( i=0; i<arguments.length; i++)
   {
     var ins = false;

     for (k=i+1; k < arguments.length; k++){
       for ( j=0; j<arguments[i].length; j++){
         if(!isin(arguments[i][j], arguments[k]))
         {
           syms.push(arguments[i][j]);
         }
       }
       for ( l=0; l<arguments[k].length; l++){
         if(!isin(arguments[k][l], arguments[i]))
         {
           syms.push(arguments[k][l]);
         }
       }
     }
   }
  return syms;
}
sym([1, 2, 3], [5, 2, 1, 4]);

答案 1 :(得分:1)

  

我的代码返回一个未定义值的数组

这是因为当您推进syms时,您的j变量的for循环已经完成。所以它实际上在j = <arguments[i].length(现在它确实是一个超出范围的索引读取)。

 if (ins === false)
 {
   syms.push(arguments[i][j]);  # push "undefined" onto syms.
 }

确保将此代码块放在for (var j=0; j<arguments[i].length; j++)块中。

答案 2 :(得分:1)

为了解决多个数组的对称差异,我们可以从设计一个返回两个数组的对称差异的函数开始

function sym2()所示,从sym2(a1,a2)获取结果的主要思路可分为两个步骤:(1)。对于数组a1 []中的每个元素,如果a1 [j]不在数组中a2 [] a1 [j]不在结果数组syms []中,则推送a1 [j]到结果数组。 (!isin(a1 [j],syms)可以防止a1 []中的重复数,例如sym2([1,1],[3])可以返回[1,3]而不是在完成a1-a2之后,第二步a2-a1以相同的方式执行(2)。对于数组a2 []中的每个元素,如果a2 [l]不在数组a1中[ ]和a2 [l]不在结果数组syms []中,然后将a2 [l]推送到结果数组。

函数sym()获取数组列表,首先,我们可以将所有数组从参数保存到变量,如arg [array1,array2,array3],并使用数组.reduce()功能。例如,如果arg包含[a1,a2,a3] arg.reduce(函数(a,b){return sym2(a,b)});执行如下:

  1. syms2(a1,a2)

  2. syms2(syms2(A1,A2),a3)的

  3. 所有代码:

    function isin(num,arra)
    {
        for (var i=0; i<arra.length; i++)
            if (num == arra[i]){return true;}
        return false;
    }
    
    function sym2(a1,a2) 
    {
        var j,l;
        var syms = [];  
        for ( j=0; j<a1.length; j++){
            if(!isin(a1[j], a2)&&!isin(a1[j],syms))
                syms.push(a1[j]);
            }
        for ( l=0; l<a2.length; l++){
            if(!isin(a2[l], a1)&&!isin(a2[l],syms))
                syms.push(a2[l]);
            }     
        return syms;
    }
    function sym(){
        var arg=[];
        for(var o = 0; o<arguments.length;o++)
            arg.push(arguments[o]);
        return arg.reduce(function(a,b){
            return sym2(a,b);
        });
    }