Subarray of length K having concatenation of its elements divisible by X
Given an array arr[] consisting of N positive integers, the task is to find a subarray of length K such that concatenation of each element of the subarray is divisible by X. If no such subarray exists, then print “-1”. If more than one such subarray exists, print any one of them.
Examples:
Input: arr[] = {1, 2, 4, 5, 9, 6, 4, 3, 7, 8}, K = 4, X = 4
Output: 4 5 9 6
Explanation:
The elements of the subarray {4, 5, 9, 6} concatenates to form 4596, which is divisible by 4.
Input: arr[] = {2, 3, 5, 1, 3}, K = 3, X = 6
Output: -1
Naive Approach: The simplest approach to solve the problem is to generate all possible subarrays of length K and print that subarray whose concatenation of elements is divisible by X. If no such subarray exists, print “-1”. Otherwise, print any of these subarrays.
Time Complexity: O(N2)
Auxiliary Space: O(1)
Efficient Approach: The above approach can be optimized using the Sliding Window Technique. Follow the steps below to solve the problem:
- Generate a number by concatenating the first K array elements. Store it in a variable, say num.
- Check if the number generated is divisible by X or not. If found to be true, then print the current subarray.
- Otherwise, traverse the array over the range [K, N] and for each element follow the steps below:
- Add the digits of the element arr[i] to the variable num.
- Remove the digits of the element arr[i – K] from the front of the num.
- Now check if the current number formed is divisible by X or not. If found to be true, then print the current subarray in the range [i – K, i].
- Otherwise, check for the next subarray.
- If no such subarray exists, then print “-1”.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int findSubarray(vector< int > arr,
int K, int X)
{
int i, num = 0;
for (i = 0; i < K; i++) {
num = num * 10 + arr[i];
}
if (num % X == 0) {
return 0;
}
for ( int j = i; j < arr.size(); j++) {
num = (num % ( int ) pow (10, j - 1))
* 10
+ arr[j];
if (num % X == 0) {
return j - i + 1;
}
}
return -1;
}
void print(vector< int > arr, int answer,
int K)
{
if (answer == -1) {
cout << answer;
}
else {
for ( int i = answer;
i < answer + K; i++) {
cout << arr[i] << " " ;
}
}
}
int main()
{
vector< int > arr = { 1, 2, 4, 5, 9,
6, 4, 3, 7, 8 };
int K = 4, X = 4;
int answer = findSubarray(arr, K, X);
print(arr, answer, K);
return 0;
}
|
Java
import java.io.*;
import java.util.*;
class GFG{
static int findSubarray(ArrayList<Integer> arr, int K,
int X)
{
int i, num = 0 ;
for (i = 0 ; i < K; i++)
{
num = num * 10 + arr.get(i);
}
if (num % X == 0 )
{
return 0 ;
}
for ( int j = i; j < arr.size(); j++)
{
num = (num % ( int )Math.pow( 10 , j - 1 )) *
10 + arr.get(j);
if (num % X == 0 )
{
return j - i + 1 ;
}
}
return - 1 ;
}
static void print(ArrayList<Integer> arr, int answer,
int K)
{
if (answer == - 1 )
{
System.out.println(answer);
}
else
{
for ( int i = answer; i < answer + K; i++)
{
System.out.print(arr.get(i) + " " );
}
}
}
public static void main(String[] args)
{
ArrayList<Integer> arr = new ArrayList<Integer>(
Arrays.asList( 1 , 2 , 4 , 5 , 9 , 6 , 4 , 3 , 7 , 8 ));
int K = 4 , X = 4 ;
int answer = findSubarray(arr, K, X);
print(arr, answer, K);
}
}
|
Python3
def findSubarray(arr, K, X):
num = 0
for i in range ( 0 , K):
num = num * 10 + arr[i]
if num % X = = 0 :
return 0
i = K
for j in range (i, len (arr)):
num = ((num % int ( pow ( 10 , j - 1 ))) *
10 + arr[j])
if num % X = = 0 :
return j - i + 1
return - 1
def print_subarray(arr, answer, K):
if answer = = - 1 :
print (answer)
else :
for i in range (answer, answer + K):
print (arr[i], end = " " )
if __name__ = = "__main__" :
arr = [ 1 , 2 , 4 , 5 , 9 ,
6 , 4 , 3 , 7 , 8 ]
K = 4
X = 4
answer = findSubarray(arr, K, X)
print_subarray(arr, answer, K)
|
C#
using System;
using System.Collections.Generic;
class GFG{
static int findSubarray(List< int > arr, int K,
int X)
{
int i, num = 0;
for (i = 0; i < K; i++)
{
num = num * 10 + arr[i];
}
if (num % X == 0)
{
return 0;
}
for ( int j = i; j < arr.Count; j++)
{
num = (num % ( int )Math.Pow(10, j - 1)) *
10 + arr[j];
if (num % X == 0)
{
return j - i + 1;
}
}
return -1;
}
static void print(List< int > arr, int answer,
int K)
{
if (answer == -1)
{
Console.WriteLine(answer);
}
else
{
for ( int i = answer; i < answer + K; i++)
{
Console.Write(arr[i] + " " );
}
}
}
static public void Main()
{
List< int > arr = new List< int >(){ 1, 2, 4, 5, 9,
6, 4, 3, 7, 8 };
int K = 4, X = 4;
int answer = findSubarray(arr, K, X);
print(arr, answer, K);
}
}
|
Javascript
<script>
function findSubarray(arr, K, X)
{
var i, num = 0;
for (i = 0; i < K; i++)
{
num = num * 10 + arr[i];
}
if (num % X == 0)
{
return 0;
}
for ( var j = i; j < arr.length; j++)
{
num = (num % parseInt(Math.pow(10, j - 1))) *
10 + arr[j];
if (num % X == 0)
{
return j - i + 1;
}
}
return -1;
}
function print(arr, answer, K)
{
if (answer == -1)
{
document.write(answer);
}
else
{
for ( var i = answer;
i < answer + K; i++)
{
document.write( arr[i] + " " );
}
}
}
var arr = [ 1, 2, 4, 5, 9,
6, 4, 3, 7, 8 ];
var K = 4, X = 4;
var answer = findSubarray(arr, K, X);
print(arr, answer, K);
</script>
|
Time Complexity: O(N)
Auxiliary Space: O(1)
Last Updated :
01 Jun, 2021
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...