哪部分代码在 hackerrank 中造成分段错误?

问题描述 投票:0回答:1

我正在尝试在 hackerrank 中解决这个问题。
https://www.hackerrank.com/challenges/circular-array-rotation/problem
其他所有测试都很好,但有一个测试正在创建分段错误。这是测试用例:
https://hr-testcases-us-east-1.s3.amazonaws.com/1884/input04.txt?AWSAccessKeyId=AKIAR6O7GJNX5DNFO3PV&Expires=1648127766&Signature=a0c1UvQ4t9DBn%2Fkr02ZnLUurhjk%3D&response-content-type=text%2Fplain 我希望我的代码的哪一部分正在创建分段错误,并且我想知道如何用代码和一些解释来解决它,因为我相信我的代码不应该创建任何分段错误。这是我的代码:

vector<int> circularArrayRotation(vector<int> a, int k, vector<int> queries) {
    rotate(a.begin(),a.begin()+a.size()-k,a.end());
    vector<int> result;
    cout<<result.size()<<endl;
    for(auto x:queries) result.push_back(a[x]);
    return result;
}

这是我在 hackerrank 解决方案中提交的代码。请帮助我通过测试。

c++ vector memory-leaks segmentation-fault memory-segmentation
1个回答
5
投票

问题是:

rotate(a.begin(),a.begin()+a.size()-k,a.end());

根据问题陈述,约束条件是:

1 <= n <= 10^5
1 <= k <= 10^5

没有限制 k <= n, and the test case you got there is exactly the hit, n = 515, k = 100000.

所以问题是:

a.begin()+a.size()-k // a.size()-k, when k > n, is negative

因此 hackerrank 编译器在执行 a.begin() 时出现问题 - 负数。

为了解决这个问题,你应该确保它不会进入负边界,并且由于它是一个圆形旋转,一整圈或 1000 整圈不会改变任何东西,只有其余部分很重要:

rotate(a.begin(), a.begin() + a.size() - (k % a.size()), a.end());

它通过了所有测试用例。

© www.soinside.com 2019 - 2024. All rights reserved.