Modify array by right shifting digits of array elements to values exceeding K
Last Updated :
14 Aug, 2021
Given an array arr[] of size N and an integer K, the task is to make all array elements > K by performing right shift operations on array elements.
Note: If it is not possible to make all array elements > K, then print -1.
Examples:
Input: arr[] = { 21, 22, 23, 19 }, K = 24
Output: { 26, 26, 27, 25 }
Explanation:
arr[0] = 10101. Performing 1 right shift -→ 11010 → 26
arr[1] = 10110. Performing 3 right shift → 11010 → 26
arr[2] = 10111. Performing 1 right shift → 11011 → 27
arr[3] = 10011. Performing 2 right shift → 11001 → 25
Input: arr[] = { 45, 37, 54, 46, 62 }, K = 48
Output: { 54, 50, 54, 53, 62 }
Approach: Follow the steps below to solve the problem :
- Traverse the array
- Perform right shift operation on digits of each array element arr[i].
- If arr[i] > k, update arr[i] and continue.
- If any array element arr[i] ≤ K, then print -1
- Otherwise, print the array arr[].
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int setBitNumber( int n)
{
int k = log2(n);
return k;
}
bool check( int arr[], int k, int n)
{
for ( int i = 0; i < n; i++) {
if (arr[i] <= k)
return false ;
}
return true ;
}
void modifyArray( int arr[], int k, int n)
{
for ( int i = 0; i < n; i++) {
if (arr[i] > k)
continue ;
else {
int bits = setBitNumber(arr[i]);
int el = arr[i];
for ( int j = 0; j < bits; j++) {
if (el & 1) {
el >>= 1;
el |= (1 << bits);
}
else {
el >>= 1;
}
if (el > k) {
arr[i] = el;
break ;
}
}
}
}
if (check(arr, k, n)) {
for ( int i = 0; i < n; i++)
cout << arr[i] << " " ;
}
else
cout << -1;
}
int main()
{
int arr[] = { 21, 22, 23, 19 };
int n = sizeof (arr) / sizeof (arr[0]);
int k = 24;
modifyArray(arr, k, n);
return 0;
}
|
Java
public class GFG
{
static int setBitNumber( int n)
{
int k = ( int )(Math.log(n) / Math.log( 2 ));
return k;
}
static boolean check( int [] arr, int k, int n)
{
for ( int i = 0 ; i < n; i++)
{
if (arr[i] <= k)
return false ;
}
return true ;
}
static void modifyArray( int [] arr, int k, int n)
{
for ( int i = 0 ; i < n; i++)
{
if (arr[i] > k)
continue ;
else
{
int bits = setBitNumber(arr[i]);
int el = arr[i];
for ( int j = 0 ; j < bits; j++)
{
if ((el & 1 ) != 0 )
{
el >>= 1 ;
el |= ( 1 << bits);
}
else
{
el >>= 1 ;
}
if (el > k)
{
arr[i] = el;
break ;
}
}
}
}
if (check(arr, k, n)) {
for ( int i = 0 ; i < n; i++)
System.out.print(arr[i] + " " );
}
else
System.out.print( "-1" );
}
public static void main(String[] args) {
int [] arr = { 21 , 22 , 23 , 19 };
int n = arr.length;
int k = 24 ;
modifyArray(arr, k, n);
}
}
|
Python3
import math
def setBitNumber(n):
k = int (math.log(n, 2 ))
return k
def check(arr, k):
for el in arr:
if el < = k:
return False
return True
def modifyArray(arr, k):
for i in range ( len (arr)):
if arr[i] > k:
continue
else :
bits = setBitNumber(arr[i])
el = arr[i]
for j in range (bits):
if el & 1 :
el >> = 1
el | = ( 1 << bits)
else :
el >> = 1
if el > k:
arr[i] = el
break
if check(arr, k):
return arr
else :
return - 1
arr = [ 21 , 22 , 23 , 19 ]
k = 24
print (modifyArray(arr, k))
|
C#
using System;
class GFG
{
static int setBitNumber( int n)
{
int k = ( int )(Math.Log(n, 2));
return k;
}
static bool check( int [] arr, int k, int n)
{
for ( int i = 0; i < n; i++)
{
if (arr[i] <= k)
return false ;
}
return true ;
}
static void modifyArray( int [] arr, int k, int n)
{
for ( int i = 0; i < n; i++)
{
if (arr[i] > k)
continue ;
else
{
int bits = setBitNumber(arr[i]);
int el = arr[i];
for ( int j = 0; j < bits; j++)
{
if ((el & 1) != 0)
{
el >>= 1;
el |= (1 << bits);
}
else
{
el >>= 1;
}
if (el > k)
{
arr[i] = el;
break ;
}
}
}
}
if (check(arr, k, n)) {
for ( int i = 0; i < n; i++)
Console.Write(arr[i] + " " );
}
else
Console.Write( "-1" );
}
public static void Main()
{
int [] arr = { 21, 22, 23, 19 };
int n = arr.Length;
int k = 24;
modifyArray(arr, k, n);
}
}
|
Javascript
<script>
function setBitNumber(n)
{
let k = Math.log2(n);
return k;
}
function check(arr, k, n)
{
for (let i = 0; i < n; i++)
{
if (arr[i] <= k)
return false ;
}
return true ;
}
function modifyArray(arr, k, n)
{
for (let i = 0; i < n; i++)
{
if (arr[i] > k)
continue ;
else
{
let bits = setBitNumber(arr[i]);
let el = arr[i];
for (let j = 0; j < bits; j++)
{
if (el & 1)
{
el >>= 1;
el |= (1 << bits);
}
else
{
el >>= 1;
}
if (el > k)
{
arr[i] = el;
break ;
}
}
}
}
if (check(arr, k, n))
{
for (let i = 0; i < n; i++)
document.write(arr[i] + " " );
}
else
document.write(-1);
}
let arr = [ 21, 22, 23, 19 ];
let n = arr.length;
let k = 24;
modifyArray(arr, k, n);
</script>
|
Time Complexity: O(N)
Auxiliary Space: O(1)
Share your thoughts in the comments
Please Login to comment...