Javascript中的Codility“PermMissingElem”解决方案

时间:2015-10-07 03:20:16

标签: javascript arrays

一个代码问题要求在零索引数组A中找到由N个不同整数组成的缺失数字。

E.g。

  Arr[0] = 2
  Arr[1] = 3
  Arr[2] = 1
  Arr[3] = 4
  Arr[4] = 6

我之前提交了一个解决方案,首先对数组进行排序,然后执行forEach函数返回值+1,其中元素之间的数组差异大于1,但这不会得到100分。

有没有办法改善这个?

11 个答案:

答案 0 :(得分:3)

使用此功能获得100的正确性和性能

function solution(A) {
    // write your code in JavaScript (Node.js 4.0.0)
    var size = A.length;
    var sum = (size + 1) * (size + 2) / 2;
    for (i = 0; i < size; i++) {
        sum -= A[i];
    }
    return sum;
}

答案 1 :(得分:1)

如果您使用高斯公式计算前N个连续数字的总和,则很容易:


    function solution(A) {
        var np1, perfectSum, sum;

        if (!A || A.length == 0) {
            return 1;
        }

        np1 = A.length + 1;

        // Gauss formula
        perfectSum = np1 * (1 + np1) / 2;

        // Sum the numbers we have
        sum = A.reduce((prev, current) => prev + current);

        return perfectSum - sum;
    }

答案 2 :(得分:1)

没有高斯公式,只有简单且简单的 for 循环,给出 O(N) 或 O(N * log(N)) 和 100% 分数:

function solution(A) {

    if(!A.length){
        return 1; //Just because if empty this is the only one missing.
    }

    let fullSum = 0;
    let sum = 0;

    for(let i = 0; i <= A.length; i++){
        fullSum += i+1;
    }

    for(let i = 0; i < A.length; i++){
        sum += A[i];
    }    

    return fullSum - sum;

}

答案 3 :(得分:0)

尝试使用Math.minMath.maxwhile循环

var Arr = [];

Arr[0] = 2
Arr[1] = 3
Arr[2] = 1
Arr[3] = 4
Arr[4] = 6

var min = Math.min.apply(Math, Arr),
  max = Math.max.apply(Math, Arr),
  n = max - 1;

while (n > min) {

  if (Arr.indexOf(n) === -1) {
    console.log(n);
    break;
  } 

  --n;

}

答案 4 :(得分:0)

这是100%的javascript解决方案:

function solution(A) {
    if (!A.length) return 1;
    let n = A.length + 1;
    return (n + (n * n - n) / 2) - A.reduce((a, b) => a + b);
}

如果给定数组为空,则返回1,这是空数组中缺少的元素。

接下来,假设序列中的第一个元素始终为1,我们将计算“常规”序列之和。然后,找到给定数组与完整序列之间的差,然后将其返回。这是缺少的元素。

我在这里使用的数学函数是序列和,以及最后一个元素:

  • S n =(n / 2)*(a 1 + a n
  • a n = a 1 +(n-1)* d

答案 5 :(得分:0)

根据第一个自然数公式的总和

enter image description here

现在,由于任务中对我们来说N项是(N + 1),因此我们将n替换为n + 1并得到

enter image description here

使用上面的公式,我们可以计算1到n + 1之间的数字总和,因为在这些数字之间有缺失的数字,现在我们可以做的是开始遍历给定数组A并减去数组项从数字的总和。期末和是数组中缺少的项目。因此:

function solution(A) {

    var n = A.length;

    // using formula of first natural numbers 
    var sum = (n + 1) * (n + 2) / 2;

    for (var i = 0; i < n; i++) {
        sum -= A[i];
    }

    return sum;
}

答案 6 :(得分:0)

这应该很好:

function solution(A) {

      // Size of the A array
      const size = A.length;

      // sum of the current values
      const arrSum = A.reduce((a, b) => a + b, 0);

      // sum of all values including the missing number
      const sum = (size + 1) * (size + 2) / 2;

      // return substruction of all - current
      return (sum - arrSum);

    }

答案 7 :(得分:0)

这让我100%

function solution(A) {
if (A.length === 0 || !A) {
    return 1;
}

A.sort((a, b) => a - b);
let count = A[0];
if (count !== 1) { return 1 }
for (let i = 0; i <= A.length; i++) {
    if (A[i + 1] === count + 1) {
        count ++;
        continue
    }
    return count + 1;
}

}

答案 8 :(得分:0)

我得到了另一种没有高斯公式的100%正确性/性能解决方案,而是先对数组进行排序:

function solution(A) {
    A.sort((a, b) => a-b);
    
    for(let i=0; i<A.length; i++){
       if(A[i] != i+1) {
           return 0;
       }
    }
    return 1;
}

答案 9 :(得分:0)

Mutex

答案 10 :(得分:-2)

我的代码遇到了同样的问题:

function solution(A) {
    var i, next;

    A.sort();

    next = 1;
    for (i=0; i<A.length; i++){
        if (A[i] != next) return next;
        next++;
    }

    return next;
}

尽管它的正确性得分为100%,但它在所有性能测试中都给出了错误答案。

C中的相同代码在两者上都获得100%:

int cmpfunc (const void * a, const void * b){
   return ( *(int*)a - *(int*)b );
}

int solution(int a[], int n) {
    int i, next;

    qsort(a, n, sizeof(int), cmpfunc);

    next = 1;
    for (i=0; i<n; i++){
        if (a[i] != next) return next;
        next++;
    }

    return next;
}