【问题标题】:I can't understand codility PermMissingElem wrong using C/C++我无法理解 codility PermMissingElem 使用 C/C++ 错误
【发布时间】:2016-09-28 18:22:38
【问题描述】:

我使用 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跟随,结果是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 ..

谢谢。

【问题讨论】:

  • 你为什么返回一个 long long 作为 int?如果它大于 int 的可能值怎么办?
  • 也许编译成 64 位可能会有所帮助
  • sum = ((n+1)*(n+2))/2 是否应该等同于 total = N * (N + 1) / 2
  • 另外,您可以使用for (const auto&amp; e : A) 作为循环来代替
  • @Link 因为 n 的大小可能是 100,000,所以我认为 long long 可以覆盖 n*n 的值。我认为 codility 错误消息意味着溢出.. 但我不能完全理解

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


【解决方案1】:

你将 n 存储在一个 int 中。所以当你平方它时,你仍然有一个 int。然后将该 int 分配给 long long sum,但为时已晚,因为已经发生溢出。

【讨论】:

  • 谢谢!哦..我没想到..我解决了:)
【解决方案2】:

这里是 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。然后我们找到给定数组与完整系列之间的差,并将其返回。这是缺少的元素。

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

  • Sn = (n/2)*(a1 + an)
  • an = a1 + (n - 1)*d

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多