我正在尝试解决problem,这是基本级别数组问题。我实现了我的逻辑,并通过了该页面上给出的示例测试用例,还尝试了一些自定义输入,它did可以正常工作。但是,当我提交我的代码时,它给出了Segmentation Fault,但不幸的是,它没有告诉它发生在哪个特定的测试用例上。
所以,这是我的逻辑:-
检查K是否精确除以N,因为如果这样做,我们可以简单地在循环中使用reverse
函数
如果不是这样,我们首先将元素反转到e(属于给定组)
这是我的代码:-
#include <bits/stdc++.h>
using namespace std;
int main(){
int T; cin >> T;
while(T--) {
int N, K;
cin >> N >> K;
int A[N];
for (int i = 0; i < N; i++)
cin >> A[i];
if (N / K != 0) {
int G = (int)(N / K); // G -> groups
int e = G * K; // e -> no. of elements which fall under given group
for (int i = 0; i < e; i += K)
reverse(A + i, A + i + K);
reverse(A + e , A + N); // reversing remaining elements
}
else {
for (int i = 0; i < N; i += K)
reverse(A + i, A + i + K);
}
for (int i = 0; i < N; i++)
cout << A[i] << " ";
cout << "\n";
}
return 0;
}
现在一切都按预期工作,但是为什么要在提交代码时给予SIGSEGV?以及如何找到引起此问题的特定行?
PS:我知道我不应该使用using namespace std
和bits/stdc++.h
,并且我知道它的含义
所以这里的错误是reverse(A + i, A + i + K);
,因为如果K> N,则A + i + K
中的reverse()
将访问超出范围的内存,因此会导致SIGSEGV
。解决方案是使用reverse(A + i, min(A + N, A + i + K));
,当K> N