代码的哪一部分在 hackerrank 中创建了 Segmentation Fault?

which part of code is creating Segmentation Fault in hackerrank?

我正在尝试在 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 解决方案中提交的代码。请帮助我通过测试。

问题是:

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

根据问题陈述,约束是:

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

没有k <= n的约束,你得到的测试用例正好命中,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());

它通过了所有测试用例。