代码之家  ›  专栏  ›  技术社区  ›  Brian Hernandez

寻找离群值

  •  1
  • Brian Hernandez  · 技术社区  · 6 年前

    CodeWars.com 我希望在正确的方向上得到一点推动。下面的函数应该接受一个数字字符串(如 "2 4 7 8 10" "1 2 2" CodeWars.com 链接至: https://www.codewars.com/kata/iq-test/train/javascript )

    "100 100 1" "5 3 2"

    function iqTest(numbers){
      let numArr = numbers.split(' ');
      let obj = {};
      obj.evenCount = 0;
      obj.oddCount = 0;
      console.log(numArr);
    
      for (let i = 0; i < numArr.length; i++) {
        if (numArr[i] % 2 === 0) {
          obj.evenCount += 1;
          obj.even = i + 1;
        } else {
          obj.oddCount += 1;
          obj.odd = i + 1;
        }
      }
    
      if (obj.even < obj.odd) {
        return (obj.even);
      } else {
        return (obj.odd);
      }
    }
    
    console.log(iqTest('5 3 2'));
    3 回复  |  直到 6 年前
        1
  •  3
  •   Nick Parsons Felix Kling    6 年前

    你需要检查一下房间 eventCount oddCount odd event 类似这样的属性:

    if (obj.evenCount < obj.oddCount) {
    

    function iqTest(numbers) {
      let numArr = numbers.split(' ');
      let obj = {};
      obj.evenCount = 0;
      obj.oddCount = 0;
      console.log(numArr);
    
      for (let i = 0; i < numArr.length; i++) {
        if (numArr[i] % 2 === 0) {
          obj.evenCount += 1;
          obj.even = i + 1;
        } else {
          obj.oddCount += 1;
          obj.odd = i + 1;
        }
        
        if(obj.oddCount > 0 && obj.evenCount > 0 && obj.oddCount !== obj.evenCount) { // early termination condition
          break; // break out of the loop is the difference between odd and even already exists
        }
      }
    
      if (obj.evenCount < obj.oddCount) { // change to check the counts
        return (obj.even);
      } else {
        return (obj.odd);
      }
    }
    
    console.log(iqTest("2 4 7 8 10")); // 3 (item: 7)
    console.log(iqTest("1 2 2")); // 1 (item: 1)
    console.log(iqTest("100 100 1")); // 3 (item: 1)
    console.log(iqTest("5 3 2")); // 3 (item: 2)
        2
  •  2
  •   Community Tales Farias    4 年前

    如前所述,代码中的问题是您试图确定哪一个是多数(奇数或偶数),但您可以通过比较 最后发生位置 obj.odd obj.even 发生次数 ( obj.evenCount obj.oddCount ).

    只需将其更改为: if (obj.evenCount < obj.oddCount) { ... }


    总是 查看整个数组,但是您可以通过以下方法确定异常值是偶数还是奇数 看看前三个数字

    考虑到这一点,我们可以通过将其分为两个步骤来提高效率:

    1. odd even .

    2. 当我们找到第一个异常值时退出,而不是搜索整个数组。

    function iqTest(stringOfNumbers) {
        let arr = stringOfNumbers.split(' ');
        let desiredRemainder = arr
          .slice(0,3)
          .reduce((evenCount, item) => item % 2 === 0 ? evenCount+1 : evenCount, 0) 
            > 1
              ? 1
              : 0;
        return arr.findIndex(i => i % 2 === desiredRemainder) + 1;
    }
        
    console.log(iqTest("3 4 7 9"));
    console.log(iqTest("1 1 1 100"));
    console.log(iqTest("5 2 3"));

    function iqTest(stringOfNumbers) {
        let arr = stringOfNumbers.split(' ');
        let firstThree = arr.slice(0,3);
        let evenCount = firstThree.reduce((evenCount, item) => item % 2 === 0 ? evenCount+1 : evenCount, 0);
        let desiredRemainder = evenCount > 1 ? 1 : 0;
        let indexOfOutlier = arr.findIndex(i => i % 2 === desiredRemainder);
        return  indexOfOutlier+1;
    }
        
    console.log(iqTest("3 4 7 9"));
    console.log(iqTest("1 1 1 100"));
    console.log(iqTest("5 2 3"));
    1. 我用 Array.reduce()

    2. item % 2 === 1 (奇数)。

      如果异常值为偶数,我们将查找第一项 item % 2 === 0 (偶数)。

    3. Array.findIndex() true (我补充说 1 复制您的代码)。

        3
  •  1
  •   Shidersz    6 年前

    找出给定的数字中哪一个与其他数字不同。鲍勃注意到 不同 均匀度

    我将给出一种使用内置数组方法的替代方法,对于标准方法,请参阅 尼克·帕森 答复:

    function iqTest(numbers)
    {
        return 1 + numbers.split(" ").findIndex(
            (x, idx, arr) => arr.filter(y => y % 2 === x % 2).length === 1
        );
    }
    
    console.log(iqTest("2 4 7 8 10")); // 3 (item: 7)
    console.log(iqTest("1 2 2")); // 1 (item: 1)
    console.log(iqTest("100 100 1")); // 3 (item: 1)
    console.log(iqTest("5 3 2")); // 3 (item: 2)