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

问题描述 投票:0回答:1

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

所以,这是我的逻辑:-

  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,并且我知道它的含义

c++ arrays reverse
1个回答
0
投票

所以这里的错误是reverse(A + i, A + i + K);,因为如果K> N,则A + i + K中的reverse()将访问超出范围的内存,因此会导致SIGSEGV。解决方案是使用reverse(A + i, min(A + N, A + i + K));,当K> N

时,它将同时处理一般情况和特殊情况
© www.soinside.com 2019 - 2024. All rights reserved.