c++ - 在 C++ 中反转给定大小的组中的数组
问题描述
我正在尝试解决一个基本级别的数组问题。我实现了我的逻辑并通过了该页面上给出的示例测试用例,还尝试了一些自定义输入,它确实按预期工作。但是当我提交我的代码时,它给出了一个分段错误,但不幸的是它没有告诉它发生在哪个特定的测试用例上。
所以,这是我的逻辑:-
检查 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
inreverse()
将访问超出范围的内存,因此它会导致SIGSEGV
. 解决方案是在 K > N 时使用reverse(A + i, min(A + N, A + i + K));
which 将同时处理一般情况和特殊情况