从数组中获取丢失的元素数量

时间:2019-05-03 16:00:33

标签: javascript

我正在尝试解决任务,从数组中获取大量缺少的元素。例如,如果给定数组[1,3,6],则丢失元素的数量为3(2,4,5)。但是某处代码出错,系统不接受该代码。 我尝试了一些方法,但不幸的是它们没用。

function arr(x){
 let y = [];
 for (let i = x[0]; i <= x[x.length-1]; i++){
    y.push(i);
 }
 return y.length-x.length;
}
let m = arr([1,2,3,4,5,6]);
console.log(m);

或者...

function arr(x){
    let y = [];
    for (let i = 0; i < x.length; i++){
        for (let j = 0; j < i; j++){
            if (x[i] == x[j]){
                x.splice(i,1);
                i--;
            }
        }
    }
    console.log(x);
    for (let i = x[0]; i <= x[x.length-1]; i++){
        y.push(i);
    }
    console.log(y);
    return y.length-x.length;
}
let l = arr([1,3,2,4,9]);
console.log(l);

我也尝试对数组进行排序,但是没有变化

4 个答案:

答案 0 :(得分:3)

说实话,您实际上不需要for循环。我认为您可以通过检查数组的最大数量,最小数量和长度来计算nr。

这对您也有用吗?

TargetObject

答案 1 :(得分:2)

您可以按照以下步骤进行操作:

  • 从数组中删除重复的元素。
  • 通过从倒数中减去第一个值来获取数组的范围。
  • 从数组的长度中减去范围。

注意:我正在考虑对数组进行排序。

function missed(arr){
  arr = [...new Set(arr)];
  return arr[arr.length - 1] - arr[0] - arr.length + 1
}

console.log(missed([1,3,6]))

如果需要在未排序的数组上使用它。然后使用Math.max()Math.min()

function missed(arr){
  arr = [...new Set(arr)];
  let max = Math.max(...arr);
  let min = Math.min(...arr);
  return max - min - arr.length + 1
}

console.log(missed([1,3,6]))
console.log(missed([6,1,3]))

答案 2 :(得分:0)

我不知道优化是否是必须的,我认为最简单的非ES6(对所有浏览器都支持)无效的方法是对数组进行排序并遍历数组,记录您期望但缺少的数字。像这样:

var arr = [4,1,6,8];
arr.sort();
var miss = [];
var expect = arr[0]; // The starting number is the first element in the array I guess. Change to 1 if you want it to be 1

// Loop through the sorted array
for (var i = 0; i < arr.length; i++) {
    while(arr[i] > expect++) { // keep looping while the current number is not the one expected, and increment the expected by one
        miss.push(expect-1); // If missed, record the missed number (which is the actual expected minus 1, as we already incremented it)
    }
}

console.log(miss);

答案 3 :(得分:0)

您可以尝试:

function arr(x){
 let y = [];
  let start = Math.min(...x);
  let end = Math.max(...x);
 for (let i = start; i <= end; i++){
    y.push(i);
 }
 return y.length-x.length;
}

let m = arr([1,3,6]);

console.log(m);