在 C++ 中以给定大小的组反转数组

Reverse an array in groups of given size in C++

我正在尝试解决 problem 这是一个基本级别的数组问题。我实现了我的逻辑并通过了该页面上给出的示例测试用例,还尝试了一些自定义输入,它 did 按预期工作。但是当我提交我的代码时它给出了一个分段错误,但不幸的是它没有告诉它发生在哪个特定的测试用例上。

所以,这是我的逻辑:-

  1. 检查 K 是否整除 N,因为如果是,我们可以简单地在循环中使用 reverse 函数

  2. 如果不是,我们首先反转元素直到 e(在给定组下)

  3. 然后我们分别对剩下的元素进行逆向

这是我的代码:-

#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 stdbits/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

时,它将处理一般情况和特殊情况