【问题标题】:Find out which one of the given numbers differs from the others for Javascript找出给定数字中的哪一个与 Javascript 的其他数字不同
【发布时间】:2025-11-25 17:05:01
【问题描述】:

我正在尝试解决这个问题。有一串数字,程序在给定的数字中找到一个不同的均匀度,并返回这个数字的位置。元素必须通过其索引返回(数字是数字所在的实际位置)。如果它的索引为 0,它必须返回为 1。到目前为止我有这个,但它没有通过一项测试。我不太清楚为什么,因为感觉应该。有谁能够看到错误是什么?任何帮助表示赞赏!

function iqTest(numbers) {
    var num = numbers.split(" ");
    var odd = 0;
    var even = 0;
    var position = 0;
    for(var i = 0; i < num.length; i++) {
        if(num[i]%2!==0) {
           odd++;
           if(odd===1) {
              position = num.indexOf(num[i]) + 1;
             }
        }
        else if(num[i]%2===0) {
           even++;
           if(even===1) {
           position = num.indexOf(num[i]) + 1;
            }
          }
    }
    return position;
}
iqTest("2 4 7 8 10") output 3
iqTest("2 1 2 2") output 2
iqTest("1 2 2") outputs 2 when it should be 1 

【问题讨论】:

  • 请为所有测试添加想要的结果。
  • 未来提示:在实现这样的算法之前,请考虑使用 TDD。它可以让您定义给定输入的确切期望,例如it("should return -1 for empty string", () =&gt; { expect(iqTest("")).to.equal(-1); }); 明确定义了如果输入为空,算法需要输出什么。您编写满足此条件的代码,并在继续修改它时,始终确保所有以前编写的测试都通过。这通常会产生干净且不易出错的代码。

标签: javascript for-loop indexing split


【解决方案1】:
public static int Test(string numbers)
{
           var ints = numbers.Split(' ');
           var data = ints.Select(int.Parse).ToList();
           var unique = data.GroupBy(n => n % 2).OrderBy(c =>
           c.Count()).First().First();
           return data.FindIndex(c => c == unique) + 1;
        }

【讨论】:

  • 请尝试添加简短说明,说明您的答案如何提出问题的解决方案。它更有帮助,不需要更多的努力
【解决方案2】:

由于第一个数字决定了您要查找的是偶数还是奇数,因此请单独计算。 然后,找到第一个不匹配的数字。

function iqTest(numbers){
   // ...
   const numArr = numbers.split(' ');

   const checkStatus = num => (parseInt(num) % 2) ? 'odd' : 'even';

   const findUniqueStatus = array => {
      let numEvens = 0;

      array.forEach(function(value){
         if (checkStatus(value) == 'even') { numEvens++; }
      });

      return (numEvens === 1) ? 'even' : 'odd'
   }

     let statuses = numArr.map(checkStatus),
     uniqueStatus = findUniqueStatus(numArr);

     return statuses.indexOf(uniqueStatus) + 1;
    }
}

【讨论】:

    【解决方案3】:

    您的代码过于复杂。

    由于第一个数字决定了您要查找的是偶数还是奇数,因此请单独计算。然后,找到第一个不匹配的数字。

    function iqTest(numbers) {
        numbers = numbers.split(" ");
        var parity = numbers.shift() % 2;
        for( var i=0; i<numbers.length; i++) {
            if( numbers[i] % 2 != parity) {
                return i+2; // 1-based, but we've also skipped the first
            }
        }
        return 0; // no number broke the pattern
    }
    

    话虽如此,iqTest("1 2 2") 应该返回2,因为位置 2 的数字(字符串中的前 2)确实是第一个打破奇偶校验模式的数字(@987654324 @已成立为奇数)

    【讨论】:

    • “在给定的数字中,程序找到一个不同的均匀度”,所以1 2 2应该返回1。
    • @georg 在均匀度上“不同”。这意味着第一个永远不会“不同”,因为没有什么不同的!
    • @NiettheDarkAbsol OP 声明“iqTest("1 2 2") 在应该为 1 时输出 2”。这是期望,程序必须满足它。恐怕你的假设是错误的。
    • @mingos 虽然 OP 确实这么说,但我觉得实际上是 OP 误解了他们想要做什么。要么就是这样,要么他们已经说得很不清楚了,因为问题只是“找到第一个不是偶数的数字的位置”,在这种情况下,他们的尝试不会包括所有检查奇数的行为与偶数检查相同。
    • @NiettheDarkAbsol 我是这样看待这个问题的:你有一袋彩色球,全是红色的,一个是绿色的。选择与其他不同的一个。绿球是你拔出的第一个还是最后一个都没有关系——它仍然是与其他不同的那个。在原始帖子中,唯一的区别是,我们有偶数和奇数,而不是按顺序从麻袋中取出球。
    【解决方案4】:

    您必须定义哪个“均匀度”是不同的。对这两种情况使用不同的计数器,如果没有一个不同的计数器,则返回 -1。像这样的:

        function iqTest(numbers) {
        var num = numbers.split(" ");
        var odd = 0;
        var even = 0;
        var positionOdd = 0;
        var positionEven = 0;
        for(var i = 0; i < num.length; i++) {
           if(num[i]%2!==0) {
           odd++;
           if(odd===1) {
           positionOdd = i + 1;
             }
           }
           else if(num[i]%2===0) {
           even++;
           if(even===1) {
           positionEven = i + 1;
            }
          }
        }
        if (odd == 1)
           return positionOdd;
        else if (even == 1)
           return positionEven;
        else
           return -1;
       }
    

    请注意,如果您只有一个偶数和一个奇数,则将使用我的方法返回后者。从我的解决方案开始根据您的意愿调整逻辑。

    【讨论】:

    • 你有没有注意到num.indexOf(num[i]) 只是... i?除非num[i]在数组中不是唯一的,否则就是错误的。
    • @NiettheDarkAbsol:你是对的。我编辑了解决方案,但我同意 OP 的实现(从我开始)确实过于复杂。
    • @Andrea 感谢您的帮助!我是新手,抱歉解决方案过于复杂!欣赏解释!
    • @padawan07:不客气;)很高兴我的解释足够清楚!
    【解决方案5】:

    最简单的方法是收集子数组中的所有偶数/奇数位置,并检查最后长度为 1 的数组:

    function iqTest(numbers) {
        numbers = numbers.split(' ');
    
        var positions = [[], []];
    
        for (var i = 0; i < numbers.length; i++) {
            positions[numbers[i] % 2].push(i + 1);
        }
    
        if(positions[0].length === 1) return positions[0][0];
        if(positions[1].length === 1) return positions[1][0];
    
        return 0;
    
    
    }
    
    console.log(iqTest("2 4 7 8 10"))
    console.log(iqTest("2 1 2 2"))
    console.log(iqTest("1 2 2"))
    console.log(iqTest("1 3 2 2"))

    【讨论】: