Javascript 从数组中返回缺少的数字(算法)
我正在研究一个算法问题(关于leetcode),它提出以下问题: 给定包含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()
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;
}