Search code examples
javascriptarraysalgorithmarray-algorithms

Finding the outlier in an array


I have written a function which given an array full of all odd numbers and one even number, it returns the one even number. Given an array full of all even numbers and one odd number, it returns the one odd number.

ex : findOutlier([2,6,8,10,3]) will return 3, since it is the only odd number in the array

I have gotten this to work, but for some reason it will not work with certain large negative numbers? It returns undefined instead of the outlier number.

Here is my code:

function findOutlier(integers){
  let testingForOdds = true;
  let evenCounter = 0;
  let oddCounter = 0;
  for (let i = 0; i < 3; i++){
    if (integers[i] % 2 === 0){
      evenCounter = evenCounter + 1
      if (evenCounter === 2){
        testingForOdds = true;
      }
    }
    else if (integers[i] % 2 === 1){
      oddCounter = oddCounter + 1
      if (oddCounter === 2){
        testingForOdds = false;
      }
    }
  }
  if (testingForOdds){
    for (let i = 0; i < integers.length; i++){
      if (integers[i] % 2 === 1){
        return integers[i]
      }
    }
  } else {
    for (let i = 0; i < integers.length; i++){
      if (integers[i] % 2 === 0){
        return integers[i]
      }
    }
  }
}
findOutlier([-100000000007, 2602, 36]);

For some reason, findOutlier([-100000000007, 2602, 36]); returns undefined. However, findOutlier([2,6,8,10,3]) will successfully return 3. Why is this happening?


Solution

  • As Michael has pointed out, you get the issue because -100000000007 % 2 evaluates to -1. As a side note, you can optimize your logic to reduce the number of comparisons done like so:

    function findOutlier(arr) {
      let isEven = true;
      const a = arr[0];
      const b = arr[1];
      if (([-1, 1].includes(a % 2) && [-1, 1].includes(b % 2))) {
        isEven = false;
      } else if (!(a % 2 === 0 && b % 2 === 0)) {
        const c = arr[2];
        if (c % 2 === 1) isEven = false;
      }
      for (let i = 0; i < arr.length; i += 1) {
        const even = arr[i] % 2 === 0;
        if (even !== isEven) return arr[i];
      }
    }