用于编码FrogRiverOne的C ++代码在大型置换测试中失败

时间:2014-12-08 05:07:47

标签: c++ algorithm

以下是上述练习的链接。

https://codility.com/demo/results/demoH5GMV3-PV8

以下是任务说明:

一只小青蛙想要到达河的另一边。青蛙目前位于0号位置,想要到达位置X.树叶从树上掉落到河面上。

给出一个非空零索引数组A,由表示落叶的N个整数组成。 A [K]表示一片叶子在时间K下降的位置,以分钟为单位测量。

目标是找到青蛙可以跳到河的另一边的最早时间。只有当叶子出现在从1到X的河对岸的每个位置时,青蛙才能穿过。

例如,给定整数X = 5和数组A,使得:

A[0] = 1
A[1] = 3
A[2] = 1
A[3] = 4
A[4] = 2
A[5] = 3
A[6] = 5
A[7] = 4

在第6分钟,一片叶子落到第5位。这是叶子出现在河对岸各个位置的最早时间。

写一个函数:

class Solution {public int solution(int X,int [] A); } 给定一个由N个整数和整数X组成的非空零索引数组A,返回青蛙可以跳到河的另一边的最早时间。

如果青蛙永远不能跳到河的另一边,那么该函数应该返回-1。

除了一个测试用例 - 大排列测试之外,我不明白代码如何给出可接受的答案。 我得到-1而不是90999。

int solution(int X, vector<int> &A) {
// write your code in C++11
int N = A.size();
long long target = (X + 1) * X / 2;
vector<int> mark;
mark.resize(X + 1, 0);
for(int i = 0; i < N; ++i){
    if(mark[A[i]] == 0){
        target -= A[i];
        mark[A[i]] = 1;
    }
    if(target == 0)
        return i;
}
return -1;
}

当我修改代码时:

int solution(int X, vector<int> &A) {
// write your code in C++11
int N = A.size();
int target = X;
vector<int> mark;
mark.resize(X + 1, 0);
for(int i = 0; i < N; ++i){
    if(mark[A[i]] == 0){
        --target;
        mark[A[i]] = 1;
    }
    if(target == 0)
        return i;
}
return -1;
}

它使测试用例正确。 任何人都可以解释原因吗?

4 个答案:

答案 0 :(得分:3)

这条线完全没有意义:

long long target = (X + 1) * X / 2;

您在int类型中进行了所有数学运算,没有理由将结果存储在long long变量中。任何溢出都已经发生。

当然,您已经知道问题存在,因为您只更改了两行代码。

答案 1 :(得分:0)

此代码使用Java。它利用了1 + 2 + .. + n = n *(n + 1)/ 2的事实。

public static int solution(int X, int[] A){
    int[] Y=new int[X];  // 0 if leaf dropped here before, else 1
    int sum=X*(X+1)/2; 
    for (int i=0;(i<A.length);i++){
        if (Y[A[i]-1]==0) { //the first time a leaf drops to this position
            Y[A[i]-1]=1;
            sum-=A[i]; 
            if (sum==0) return i;            
        }     
    }
    return -1;  
}

答案 2 :(得分:0)

C ++,得分100.制作地图,然后检查地图的大小是否等于X:D

#include <vector>
#include <map>

using namespace std;

int solution(int X, vector<int> &A) {
    map<int, bool> m;
    for (int i = 0; i < A.size(); i++) {
        int element = A[i];
        m[element] = true;
        if (m.size() == X) {
            return i;
        }
    }
    return -1;
}

答案 3 :(得分:0)

此代码在Cpp中使用矢量,且时间复杂度为O(N)

int solution(int X, vector<int> &A) {
    int length = -1;
    std::vector<int>::iterator it;
    int max = X; int i = 0;

    std::vector<bool> visited;
    visited.reserve(X+1);
    visited.resize(X+1);

    for (it=A.begin();it!=A.end();it++, i++) {
        if(*it <= X) {
            if(!visited.at(*it)) {
                visited.at(*it) = true;
                max--;
            }
            if(max == 0) {
                length = it - A.begin();
                break;
            }
        }
    }
    return length;
}