首页 > 解决方案 > 查找数组中的异常值

问题描述

我编写了一个函数,它给定一个包含所有奇数和一个偶数的数组,它返回一个偶数。给定一个包含所有偶数和一个奇数的数组,它返回一个奇数。

ex :findOutlier([2,6,8,10,3])将返回 3,因为它是数组中唯一的奇数

我已经让它工作了,但由于某种原因,它不适用于某些大的负数?它返回未定义而不是异常值。

这是我的代码:

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]);

出于某种原因,findOutlier([-100000000007, 2602, 36]);返回未定义。但是,findOutlier([2,6,8,10,3])会成功返回 3. 为什么会这样?

标签: javascriptarraysalgorithmarray-algorithms

解决方案


正如迈克尔指出的那样,您会遇到问题,因为-100000000007 % 2评估为-1. 作为旁注,您可以优化逻辑以减少比较次数,如下所示:

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];
  }
}

推荐阅读