# Reverse every consecutive m-elements of a subarray

Posted in

Vinay Khatri
Last updated on September 28, 2022

## Problem

Given an array, reverse every sub-array formed by consecutive m elements.

#### Sample Input

`[1, 2, 3, 4]     m = 3`

#### Sample Output

`[3, 2, 1, 4]`

## Approach

We can initially place a pointer ``` i ``` at ``` ( ``` ``` m-1)th ``` index of the array to reverse the first ``` m ``` elements’ subarray by traversing ``` floor( ``` ``` m ``` ``` /2) ``` times backward. After performing this, we can increment ``` i ``` by ``` m ``` and perform a similar task on the remaining subarrays.

Note that if the size of the array is not divisible by m , then we will need to reverse remainder separately ``` (n % m) ``` elements. This approach takes O(N) time and O(1) auxiliary space.

### C++ Programming

```#include<bits/stdc++.h>
using namespace std;

// function to reverse in groups
void reverseInGroups(int arr[], int n, int m){
int i=m-1;
while(i<n){
int l2 = i;
int l1 = i-(m-1);
for(int count=1;count<=(m/2);count++){
//traverse subarray backwards and swap elements
swap(arr[l2],arr[l1]);
l1++;
l2--;
}
i+=m;
}
int rem = n%m;    //handle remaining elements
int l2 = n-1;
int l1 = l2 - (rem-1);
for(int count=1;count<=(rem/2);count++){
swap(arr[l2], arr[l1]);
l2--;
l1++;
}
}
int main(){
int arr[5] = {1, 2, 3, 4, 5};
int m = 3;
reverseInGroups(arr, 5, m);
for(int i=0; i<5; i++) cout<<arr[i]<<" ";
}
```

Output

`3 2 1 5 4`

### C Programming

```#include<stdio.h>

// function to reverse array in groups
void reverseInGroups(int arr[], int n, int m){
int i=m-1;
while(i<n){
int l2 = i;
int l1 = i-(m-1);
for(int count=1;count<=(m/2);count++){
//traverse subarray backwards and swap elements
int temp = arr[l1];
arr[l1] = arr[l2];
arr[l2] = temp;
l1++;
l2--;
}
i+=m;
}
int rem = n%m;    //handle remainder elements
int l2 = n-1;
int l1 = l2 - (rem-1);
for(int count=1;count<=(rem/2);count++){
int temp = arr[l1];
arr[l1] = arr[l2];
arr[l2] = temp;
l2--;
l1++;
}
}
void main(){
int arr[5] = {1, 2, 3, 4, 5};
int m = 3;
reverseInGroups(arr, 5, m);
for(int i=0; i<5; i++) printf("%d ",arr[i]);
}```

Output

`3 2 1 5 4`

### Another way to code the same algorithm in Python

```# Function to reverseArray array in groups
def reverseArray(arr, n, k):
i = 0

while(i<n):

left = i
right = min(i + k - 1, n - 1)

# Reverse the sub-array
while (left < right):

arr[left], arr[right] = arr[right], arr[left]
left+= 1;
right-=1
i+= k

arr = [1, 2, 3, 4, 5]

k = 3
n = len(arr)
reverseArray(arr, n, k)

for i in range(0, n):
print(arr[i], end =" ")

```

Output

`3 2 1 5 4`