【问题标题】:Return missing number from Array (algorithm)从数组中返回缺失的数字(算法)
【发布时间】:2016-09-21 03:12:57
【问题描述】:

我正在研究一个算法问题(在 leetcode 上),它提出以下问题:

给定一个包含 n 的不同数字的数组,该数字取自 0, 1, 2, ..., n,,找出数组中缺少的数字。

例如, 给定nums = [0, 1, 3] 返回2

我目前的答案是:

var missingNumber = function(nums) {
  return nums.filter(function(item, index, arr) {
    return arr[index] - arr[index - 1] > 1;
  }).shift() - 1; 
};

但是,leetcode 正在使用这两个测试用例(以及其他一些测试用例),这对我来说毫无意义:

输入:[0] 预期:1

输入:[0, 1] 预期:2

编辑:也...

输入:[1] 预期:0

据我了解,该算法要求返回数组中缺少的单个数字,因为第一个数字实际上缺少地方。我在这里遗漏了什么还是这个算法的说明非常不清楚?

【问题讨论】:

  • 如果给出格式正确的数组,听起来它想要序列中的下一个数字
  • 我认为他们只是想从0arr.length+1return 计算第一个你在预期的数组中找不到的。
  • @IrkenInvader:我明白了,这可以解释测试用例。虽然它也期望[1] 返回0。我将编辑我的描述。
  • [1] 将返回 0,因为缺少 0(它应该是第一个元素)
  • 这更有意义。我认为这可以解释得更清楚一点,但也许这是我的错误。

标签: javascript arrays algorithm


【解决方案1】:

使用 XOR 操作有另一种方法。这里的想法是一个数字与自身进行异或将始终为 0。我们可以将从 0 到 N 的所有数字的 XOR 存储在变量 xor1 中,并将我们数组的所有数字的 XOR 存储在变量 xor2 中。 xor1xor2 的 XOR 将是缺失的数字,因为它只会出现在 xor1 而不会出现在 xor2 中。

function foo(arr){
        var n = arr.length;
        var xor1 = 0, xor2 = 0;
        for(var i = 0;i <= n;i++)
                xor1 ^= i;
        for(var i = 0;i < n;i++)
                xor2 ^= arr[i];
        return xor1 ^ xor2;
}

【讨论】:

    【解决方案2】:

    1..n 的整数总和是:

    因此,长度为 n 且值来自 0..n 的数组的预期总和将是相同的。缺失的数字将是总数减去数组中实际值的总和:

    "use strict";
    let missingNumber = function(nums) {
        let n = nums.length;
        let expected = n * (n + 1) / 2;
        let total = nums.reduce((a, b) => a + b, 0);
        return expected - total;
    }
    

    【讨论】:

      【解决方案3】:

      这就是我将如何实现它,您可以循环直到 &lt;= 到数组长度,因此如果传入的数组通过测试,它将尝试查看 nums[nums.length] ,这将是 undefined 并返回 @987654324 @正确。如果传入一个空数组,则返回 0。

      var missingNumber = function(nums){
        for(var i = 0; i <= nums.length; i++){
          if(nums[i] !== i) return i;
        }
        return 0;
      }
      

      【讨论】:

      • 从 OP 的描述中不清楚数字必须按任何特定顺序排列,例如,给定数组 [2, 4, 0, 1, 5] 答案将是 3,但我可能误读了它。
      • 是的,我们也不确定!他的测试用例似乎倾向于始终从 0 开始并向上计数的方向。
      • 是的,不幸的是,测试用例在您开始提交代码之前不会公开,但似乎默认情况下会按顺序给出数组。谢谢大家!
      • 其实现在是在抛出无序数组。考虑到所有因素,描述并没有正确解释要求。
      【解决方案4】:

      尝试使用indexOf() 方法。如果未找到该项目,则返回 -1

      nums = [0, 1, 3];
      var missingNumber = function(nums){
        for(i = 0; i <= nums.length; i++){
          if(nums.indexOf(i) < 0 ) {
            return i;
          }
        }
        return 0;
      }
      

      【讨论】:

      • 对初学者来说是个好主意,但检查应该像 if (i !== nums[i]) return i 这样完成,因此 o(n)
      • @David Conrad True.. 必须先对它们进行排序,我想仍然会比 indexOf 方法快,顺便说一下,我认为它必须是 o(n^2 / 2),因为 indexOf 不会一旦找到它的目标,就一直持续到最后。假设 indexOf 平均每次搜索运行一半的数组可能是安全的。
      • @Redu 常数因子在 big-O 分析中被忽略。
      猜你喜欢
      • 1970-01-01
      • 2020-04-23
      • 1970-01-01
      • 2022-01-05
      • 2017-06-20
      • 1970-01-01
      • 2011-01-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多