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

Rai*_*lam 0 c++ memory-leaks vector segmentation-fault memory-segmentation

我正在尝试在 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;
}
Run Code Online (Sandbox Code Playgroud)

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

小智 5

问题是:

rotate(a.begin(),a.begin()+a.size()-k,a.end());
Run Code Online (Sandbox Code Playgroud)

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

1 <= n <= 10^5
1 <= k <= 10^5
Run Code Online (Sandbox Code Playgroud)

没有 k <= n 的约束,并且您得到的测试用例正是命中,n = 515,k = 100000。

所以问题是:

a.begin()+a.size()-k // a.size()-k, when k > n, is negative
Run Code Online (Sandbox Code Playgroud)

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

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

rotate(a.begin(), a.begin() + a.size() - (k % a.size()), a.end());
Run Code Online (Sandbox Code Playgroud)

它通过了所有测试用例。