我正在尝试在 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, 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());
它通过了所有测试用例。