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