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
People are also reading:
- Calculate 3X3 Matrix multiplication in Python and C++
- WAP to swap two numbers
- Convert temperature from Fahrenheit to Celsius and vice-versa
- Check whether a given character is an alphabet, digit or any special character
- Calculator to perform Arithmetic Operations using Switch Case
- Perfect Number in C
- WAP to find the largest number amongst the numbers entered by the user
- Calculate the average marks of 5 subjects
- WAP to find the greatest number among the three numbers