我无法理解PermnissingElem使用C / C ++的错误

时间:2016-09-28 18:22:39

标签: c++ int max permutation long-integer

我使用C ++来解决问题,熟悉PermMissingElem。 我没有使用xor,只是序列的总和。

C ++

 int solution(vector<int> &A) {
        // write your code in C++11 (g++ 4.8.2)
        int n = A.size();
        long long sum = ((n+1)*(n+2))/2;
        for(int i=0; i<n; i++) {
            sum -= A[i];
        }
        return (int)sum;
    }

对于未通过大型测试,导致80%的测试分数= ~100000
错误的答案示例,

  

得到-2147483647预期1

但是,如果使用java follow,则会产生100%。

的java

 public int solution(int[] A) {

            long N = A.length + 1;
            long total = N * (N + 1) / 2;

            for (int i : A) {

                total -= i;
            }

            return (int)total;
        }

c ++和java有什么区别? 我使用了sum,long,long long,long long int的数据类型..

THX。

2 个答案:

答案 0 :(得分:0)

将n存储在int中。因此,当你对它进行平方时,你仍然有一个int。然后你将这个int分配给一个很长的总和,但由于溢出已经发生,所以太晚了。

答案 1 :(得分: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