return "even" 如果其他数字是奇数并且 "odd" 其他数字是偶数 javascript

return "even" if others numbers are odd and "odd" the others number are even javascript

我有 2 个问题,如何获取值而不是数组中的值,以及如何使此代码更短和声明。

arr = [16, 4, 11, 20, 2]

arrP = [7, 4, 11, 3, 41]

arrTest = [2, 4, 0, 100, 4, 7, 2602, 36]

function findOutlier(arr) {
  const isPair = (num) => num % 2 === 0
  countEven = 0
  countOdd = 0
  arr1 = []
  arr2 = []
  const result = arr.filter((ele, i) => {
    if (isPair(ele)) {
      countEven++
      arr1.push(ele)

    } else {
      countOdd++

      arr2.push(ele)
    }

  })
  return countEven > countOdd ? arr2 : arr1

}

console.log(findOutlier(arrTest))

过滤两次可能更具可读性。

even = arr.filter((x) => x % 2 == 0);
odd = arr.filter((x) => x % 2 == 1);
if (even.length > odd.length) {
    return even;
} else {
    return odd;
}

如果你想用一个循环来做到这一点,考虑使用数组 reduce 方法将每个数字放入偶数或奇数桶中,然后比较这些桶的长度 return:

function findOutlier(arr) {
  const sorted = arr.reduce((acc, el) => {
    acc[el % 2].push(el);
    return acc;
  },{ 0: [], 1: [] })
  
  return sorted[0].length > sorted[1].length ? sorted[1] : sorted[0];
}

const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];

console.log(findOutlier(arr));

请注意,当数组长度相同时,这不会正常处理(现在它只是 return 奇数数组)。

现在 OP 阐明了要求(至少在评论中),这允许采用不同的方法:

function findOutlier(array) {
  let odd = undefined, even = undefined;

  for (let i of array) {
    let isEven = i % 2 == 0;
  
    if (odd !== undefined && even !== undefined)
      return isEven ? odd : even;

    if (isEven) even = i;
      else odd = i;
  }
  
  if (odd !== undefined && even !== undefined)
    return array[array.length-1];
}
    
    
console.log(findOutlier([2,4,6,8,10,5]))

算法会遍历数组,分别存储最后找到的奇数和偶数。

如果我们已经发现了一个奇数和一个偶数,我们可以根据当前的数字来决定,哪个是离群值:如果当前的数字是偶数,那么它至少是我们找到的第二个偶数。因此,找到的奇数必须是离群值。如果当前数字是奇数,则反之亦然。特殊情况,如果离群值是数组的最后一个元素,则在循环后使用附加条件进行检查。

如果所有数字都是奇数或偶数(即没有异常值),则此函数将 return 未定义。如果不满足先决条件,即如果存在多个离群值,则该算法不会抛出错误。

如果其中一种类型的计数为 1 而其他类型的计数大于 1,则您可以收集带有所需部分的对象并添加短路。

const
    isPair = num => num % 2 === 0,
    findOutlier = array => {
        count = { true: [], false: [] };
        for (const value of array) {
            count[isPair(value)].push(value);
            if (count.true.length === 1 && count.false.length > 1) return count.true[0];
            if (count.false.length === 1 && count.true.length > 1) return count.false[0];
        }
    };

console.log(...[[16, 4, 11, 20, 2], [7, 4, 11, 3, 41], [2, 4, 0, 100, 4, 7, 2602, 36]].map(findOutlier));

这里有一个解决方案,根据取模结果选择evenodd数组。

function findOutlier(integers) {
  const even = [], odd = [], modulos = [even, odd];
  for (const integer of integers) {
    modulos[Math.abs(integer % 2)].push(integer);
  }
  return even.length > odd.length ? odd : even;
}

console.log(findOutlier([2, 4, 0, 100, 4, 7, 2602, 36]));

不幸的是,您确实需要 Math.abs() 来处理负值,因为 -3 % 2 == -1.

参见:JavaScript % (modulo) gives a negative result for negative numbers

但是名称 findOutlier 让我假设在提供的列表中 只有一个异常值 。如果是这种情况你可以优化算法。

function findOutlier(integers) {
  // With less than 3 integers there can be no outlier.
  if (integers.length < 3) return;
  
  const isEven = (integer) => integer % 2 == 0;
  const isOdd  = (integer) => !isEven(integer);
  
  // Determine the outlire based on the first 3 elements.
  // If there are 0 or 1 integers even, the outlire is even.
  // if there are 2 or 3 integers even, the outlier is odd.
  const outlier = integers.slice(0, 3).filter(isEven).length < 2
                ? isEven
                : isOdd;

  return integers.find(outlier);
}

console.log(findOutlier([2, 4, 0, 100, 4, 7, 2602, 36]));

您可以在不创建中间数组的情况下执行此操作,只需将每个元素与其相邻元素进行比较,如果该元素与两者不同则返回该元素,如果未发现异常值则返回未定义。 returns 在第一次遇到异常值的同一迭代中,returns 值本身而不是数组。

function findOutlier(array) {
  const
    len = array.length,
    isEven = (n) => n % 2 === 0;

  for (const [i, value] of array.entries()) {
    let
      prev = array[(i-1+len)%len], // loop around if < 0 (first element)
      next = array[(i+1)%len];     // loop around if >= length (last element)
    if (isEven(value) !== isEven(prev) && isEven(value) !== isEven(next)) {
      return value;
    }
  }
  return undefined;
}

const arrays = [[16, 4, 11, 20, 2], [7, 4, 11, 3, 41], [2, 4, 0, 100, 4, 7, 2602, 36]]
console.log(...arrays.map(findOutlier));