首页 > 解决方案 > 在 C++ 中反转给定大小的组中的数组

问题描述

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

所以,这是我的逻辑:-

  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 std并且bits/stdc++.h我知道它的含义

标签: c++arraysreverse

解决方案


所以这里的错误是reverse(A + i, A + i + K);因为如果 K > N 那么A + i + Kinreverse()将访问超出范围的内存,因此它会导致SIGSEGV. 解决方案是在 K > N 时使用reverse(A + i, min(A + N, A + i + K));which 将同时处理一般情况和特殊情况


推荐阅读