除了单个整数之外,数组中的整数要么完全是奇数,要么完全是偶数。检索此单个整数。 JS

时间:2016-02-26 16:39:34

标签: javascript integer

您将获得一个包含整数的数组(其长度至少为3,但可能非常大)。除了单个整数N之外,数组中的整数要么完全是奇数,要么完全是偶数。编写一个将数组作为参数并返回N的方法。

例如: [2,4,0,100,4,11,2602,36] 应该返回:11

我需要工作的测试用例:

Test.assertEquals(findOutlier([0, 1, 2]), 1)
Test.assertEquals(findOutlier([1, 2, 3]), 2)
Test.assertEquals(findOutlier([2,6,8,10,3]), 3)
Test.assertEquals(findOutlier([0,0,3,0,0]), 3)
Test.assertEquals(findOutlier([1,1,0,1,1]), 0)

到目前为止,我的代码似乎无法运行:

function findOutlier(integers){
    var evens = [];
    var odds = [];
    for (var i = 0; i < integers.length; i++) {
        if (integers[i] % 2) {
            evens.push(integers[i]);
        } else {
            odds.push(integers[i]);
        }
    }
    var elen = evens.length;
    var olen = odds.length

    if (elen > olen) {
        return odds;
    } else {
        return evens;
    }
}

请使用此代码更改哪些内容?

8 个答案:

答案 0 :(得分:1)

首先,你的情况应该是:

if (integers[i] % 2 === 0) {

你需要返回数组的第一个元素:

return odds[0];

这是我如何接近它:

function findOutlier(arr) {
  var result = arr.reduce(function(p, c) {
    p[c % 2 === 0 ? 'even' : 'odd'].push(c);
    return p;
  }, { odd: [], even: [] });
  var eLen = result.even.length;
  var oLen = result.odd.length;
  if (oLen < eLen) {
    return oLen > 1 ? result.odd : result.odd[0];
  } else {
    return eLen > 1 ? result.even : result.even[0];
  };
}

DEMO

答案 1 :(得分:1)

我看到2个可能的修改: 1)返回数组中的单个值而不是所有数组

return evens[0];

更改你的if以检查modulo == 0(如果余数= 0则是偶数)

if ((integers[i] % 2) == 0) 

-

function findOutlier(integers){
   var evens = [];
   var odds = [];
   for (var i = 0; i < integers.length; i++) 
   {
       if ((integers[i] % 2) == 0) 
       {
           evens.push(integers[i]);
       } 
       else 
       {
           odds.push(integers[i]);
       }
   }
   var elen = evens.length;
   var olen = odds.length;

   if (elen > olen)
   {
       return odds[0];
   } 
   else 
   {
       return evens[0];
   }
}

答案 2 :(得分:1)

我有空闲时间......我做到了这一点,javascript非常有趣,可以很高兴获得另一种观点。

var numbers = [2,4,6,8,10,12,14,16,17,18,20];

function findOutlier(arr) {
    var odds = arr.filter(function (number) {
    return !!(number % 2)
  });

  var evens = arr.filter(function (number) {
    return !(number % 2)
  });

  var result = (odds.length < evens.length) ? odds.pop() : evens.pop();

  return result;
}

findOutlier(numbers);

答案 3 :(得分:0)

我发现了一种使用O(1)内存的方法。不会生成其他数组。它检查前3个值中有多少是偶数。如果该数字为2或更多,则查找奇数值。否则,它会寻找均值。

&#13;
&#13;
function findOutlier(arr) {
  //Big O: memory = 1, time = n;
  
  let evenCount = 0;
  
  for(let i = 0; i < 3; i++) {
    let val = arr[i];
    if(val % 2 === 0) evenCount ++;
    
  }
  
  let isEven = evenCount > 1;
  
  for (let i = 0; i < arr.length; i++) {
    if((arr[i] % 2 === 0) !== isEven) return arr[i]; 
//Check to see if number is opposite of even counts boolean
  }
  
  return new Error('Array contains no outlier.');
}
&#13;
&#13;
&#13;

答案 4 :(得分:0)

function findOne(arr){
   let evenOrOdd = {"even": [], "odd": []};

   for(let i=0; i<arr.length; i++) {
      let oddCount = evenOrOdd["odd"].length,
          evenCount = evenOrOdd["even"].length;

      if(oddCount===1 && evenCount>1 || evenCount===1 && oddCount>1) {
          break;
      }

      arr[i]%2===1 ?
        evenOrOdd["odd"].push(arr[i]) :
        evenOrdOdd["even"].push(arr[i]);
   });

   return evenOrOdd["odd"].length===1 ? 
            evenOrOdd["odd"][0] :
            evenOrOdd["even"][0];         
}

答案 5 :(得分:0)

Python版本,可在包含多个偶数或奇数且其中一个为奇数或偶数的数组中查找偶数或奇数。例如:[2,78,1004,13] = 13,[111,81,79,4,10023] = 4。

localeCompare

答案 6 :(得分:0)

检查前三个数字,如果其中两个相同,则返回异常值:

function findOutlier(integers){
  //your code here

  if (integers[0]%2 === 0 && integers[1]%2 === 0 ) {
      return integers.find(integer => integer %2 !== 0)
 } else if(integers[0]%2 !== 0 && integers[1]%2 !== 0) {
      return integers.find(integer => integer % 2 === 0)
 } else {
      if(integers[2]%2 === 0){
          return integers.find(integer => integer %2 !==0)
      }
      else {
          return  integers.find(integer => integer %2 ===0)
      }
}

答案 7 :(得分:-1)

function findOutlier(integers) {
    //your code here
    integers.sort();
    var count = 0;
    for (var i = 0; i < 3; i++) {
        if (integers[i] % 2 === 0) {
            count += 1;
        }
    }
    if (count >= 2) {
        var r = integers.filter(function(x) {
            return x % 2 !== 0;
        });
    } else {
        var r = integers.filter(function(x) {
            return x % 2 === 0;
        });
    }

    return r[0];
}