Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从数组中返回缺少的数字(算法)_Javascript_Arrays_Algorithm - Fatal编程技术网

Javascript 从数组中返回缺少的数字(算法)

Javascript 从数组中返回缺少的数字(算法),javascript,arrays,algorithm,Javascript,Arrays,Algorithm,我正在研究一个算法问题(关于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()

我正在研究一个算法问题(关于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


据我所知,该算法要求返回一个数组中缺少的单个数字,因为首先有一个实际缺少的数字。我是否在这里遗漏了什么,或者该算法的说明非常不清楚?

这是我将如何实现它的,您可以循环,直到
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;
}
尝试使用
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;
}
nums=[0,1,3];
var missingNumber=函数(nums){

对于(i=0;i使用异或运算有一种不同的方法。这里的想法是,一个与自身异或的数字总是0。我们可以在变量
xor1
中存储从0到N的所有数字的异或,在变量
xor2
中存储数组中所有数字的异或。
xor1
xor2
的异或将是缺少编号,因为它只会出现在
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;
}
函数foo(arr){
var n=阵列长度;
var xor1=0,xor2=0;

对于(var i=0;如果它给出一个格式正确的数组,我听起来它想要序列中的下一个数字。我想他们只是想从
0
开始计数,直到
arr.length+1
,然后
返回
,这可以解释测试用例。虽然它还希望
[1]
返回
0
。我将编辑我的描述。[1]将返回0,因为缺少0(它应该是第一个元素)这更有意义。我认为这可以解释得更清楚一点,但可能是我的错误。从OP的描述中不清楚数字是否需要按任何特定顺序排列,例如,给定数组
[2,4,0,1,5]
答案可能是
3
,但我可能误读了它。是的,我们也不确定!他的测试用例似乎倾向于总是从0开始并向上计数的方向。是的,不幸的是,在你开始提交代码之前,测试用例没有公开,但似乎数组在默认情况下会按顺序提供。谢谢你,永远你!事实上,现在它抛出了无序数组。从各方面考虑,描述并没有正确地解释需求。对于初学者来说,这是个好主意,但是应该像检查
如果(i!==nums[i])返回i
那么o(n)@David Conrad True.必须首先对它们进行排序,我想仍然会比indexOf方法更快,我认为它必须是o(n^2/2)顺便说一句,因为一旦indexOf找到它的目标,它就不会一直持续到最后。可以安全地假设indexOf在每次搜索中平均运行一半数组。@Redu常量因子在big-O分析中被忽略。
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;
}