Given an array arr[] consisting of N positive integers, the task is to rotate the digits of array elements in an anti-clockwise direction such that elements of the array elements are in alternate even-odd or odd-even form. If multiple solutions exists, then print any one of them. Otherwise, print -1.
Examples:
Input: arr[] = { 143, 251, 534, 232, 854 }
Output: 143 512 345 232 485
Explanation:Â
Rotating arr[1] by 1 in anticlockwise direction modifies arr[1] to 512.Â
Rotating arr[2] by 1 in anticlockwise direction modifies arr[2] to 345.Â
Rotating arr[4] by 2 in anticlockwise direction modifies arr[4] to 485.Input: arr[] = { 44, 23, 21, 33, 14 }
Output: 44 23 12 33 14
Approach: The above problem can be solved by either modifying the first array element to an odd number or an even number. The array element can be modified by converting the number into a string and then rotate the characters of the string left as needed. Follow the steps below to solve the problem:
- Rearrange the first array element as an even number and check if the remaining array elements can be rearranged into odd-even alternately or not. If found to be true, then rearrange the array elements into odd-even alternately and print the array elements.
- Otherwise, rearrange the first array element as an odd number and check if the remaining array elements can be rearranged into even-odd alternately or not. If found to be true, then rearrange the remaining array elements into even-odd alternately and print the array elements.
- Otherwise, print -1.
Below is the implementation of the above approach:
C++
// c++ program of the above approach #include <bits/stdc++.h> using namespace std; Â
// Utility function to rotate the digits of // array elements such that array elements are // in placed even-odd or odd-even alternately bool is_possible(vector< int >& arr, bool check) { Â
    // Checks if array can be converted     // into even-odd or odd-even form     bool exists = true ; Â
    // Store array elements     vector< int > cpy = arr;     bool flag;     // Traverse the array     for ( int i = 0; i < arr.size(); i++) { Â
        // Check if arr[i] is already         // at correct position         if (arr[i] % 2 == check) {             check = !(check);             continue ;         } Â
        // Checks if it is possible         // to modify the number arr[i]         // by rotating the digits of         // the number anticlockwise         flag = false ; Â
        // Stores the number arr[i] as         // string         string strEle = to_string(arr[i]); Â
        // Traverse over the digits of         // the current element         for ( int j = 0; j < strEle.size(); j++) { Â
            // Checks if parity of check and             // current digit is same or not             if ( int (strEle[j]) % 2 == check) { Â
                // Rotates the string by j + 1 times                 // in anticlockwise                 arr[i] = stoi(strEle.substr(j + 1)                               + strEle.substr(0, j + 1)); Â
                // Marks the flag                 // as true and break                 flag = true ;                 break ;             }         } Â
        // If flag is false         if (flag == false ) {             // Update exists             exists = false ;             break ;         } Â
        // Changes the         // parity of check         check = !(check);     } Â
    // Checks if arr[] cannot be     // modified, then returns false     if (!exists) {         arr = cpy;         return false ;     } Â
    // Otherwise, return true     else         return true ; } Â
// Function to rotate the digits of array // elements such that array elements are // in the form of even-odd or odd-even form void convert_arr(vector< int >& arr) { Â
    // If array elements can be arranged     // in even-odd manner alternately     if (is_possible(arr, 0)) {         for ( auto & i : arr)             cout << i << " " ;     } Â
    // If array elements can be arranged     // in odd-even manner alternately     else if (is_possible(arr, 1)) {         for ( auto & i : arr)             cout << i << " " ;     } Â
    // Otherwise, prints -1     else         cout << "-1" << endl; } Â
// Driver Code int main() { Â
    vector< int > arr = { 143, 251, 534, 232, 854 };     convert_arr(arr); } Â
// This code is contributed by grand_master. |
Java
// java program for the above approach import java.io.*; import java.lang.*; import java.util.*; Â
class GFG { Â
  // Utility function to rotate the digits of   // array elements such that array elements are   // in placed even-odd or odd-even alternately   static boolean is_possible( int arr[], int check)   { Â
    // Checks if array can be converted     // into even-odd or odd-even form     boolean exists = true ; Â
    // Store array elements     int cpy[] = arr.clone();     boolean flag;     // Traverse the array     for ( int i = 0 ; i < arr.length; i++) { Â
      // Check if arr[i] is already       // at correct position       if (arr[i] % 2 == check) {         // Changes the         // parity of check         check = (check == 0 ? 1 : 0 );         continue ;       } Â
      // Checks if it is possible       // to modify the number arr[i]       // by rotating the digits of       // the number anticlockwise       flag = false ; Â
      // Stores the number arr[i] as       // string       String strEle = Integer.toString(arr[i]); Â
      // Traverse over the digits of       // the current element       for ( int j = 0 ; j < strEle.length(); j++) { Â
        // Checks if parity of check and         // current digit is same or not         if ((strEle.charAt(j) - '0' ) % 2 == check) { Â
          // Rotates the string by j + 1 times           // in anticlockwise           arr[i] = Integer.parseInt(             strEle.substring(j + 1 )             + strEle.substring( 0 , j + 1 )); Â
          // Marks the flag           // as true and break           flag = true ;           break ;         }       } Â
      // If flag is false       if (flag == false ) {         // Update exists         exists = false ;         break ;       } Â
      // Changes the       // parity of check       check = (check == 0 ? 1 : 0 );     } Â
    // Checks if arr[] cannot be     // modified, then returns false     if (!exists) {       arr = cpy;       return false ;     } Â
    // Otherwise, return true     else       return true ;   } Â
  // Function to rotate the digits of array   // elements such that array elements are   // in the form of even-odd or odd-even form   static void convert_arr( int arr[])   { Â
    // If array elements can be arranged     // in even-odd manner alternately     if (is_possible(arr, 0 )) {       for ( int v : arr) {         System.out.print(v + " " );       }     } Â
    // If array elements can be arranged     // in odd-even manner alternately     else if (is_possible(arr, 1 )) {       for ( int v : arr) {         System.out.print(v + " " );       }     } Â
    // Otherwise, prints -1     else       System.out.println(- 1 );   } Â
  // Driver code   public static void main(String[] args)   {     // Given array     int arr[] = { 143 , 251 , 534 , 232 , 854 }; Â
    // FUnction call     convert_arr(arr);   } } Â
// This code is contributed by Kingash. |
Python3
# Python program of the above approach Â
# Utility function to rotate the digits of # array elements such that array elements are # in placed even-odd or odd-even alternately def is_possible(arr, check): Â
    # Checks if array can be converted     # into even-odd or odd-even form     exists = True Â
    # Store array elements     cpy = arr Â
    # Traverse the array     for i in range ( len (arr)): Â
        # Check if arr[i] is already         # at correct position         if (arr[i] % 2 = = check):             check = not (check)             continue Â
        # Checks if it is possible         # to modify the number arr[i]         # by rotating the digits of         # the number anticlockwise         flag = False Â
        # Stores the number arr[i] as         # string         strEle = str (arr[i]) Â
        # Traverse over the digits of         # the current element         for j in range ( len (strEle)): Â
            # Checks if parity of check and             # current digit is same or not             if int (strEle[j]) % 2 = = check: Â
                # Rotates the string by j + 1 times                 # in anticlockwise                 arr[i] = int (strEle[j + 1 :] + strEle[:j + 1 ]) Â
                # Marks the flag                 # as true and break                 flag = True                 break Â
        # If flag is false         if flag = = False : Â
            # Update exists             exists = False             break Â
        # Changes the         # parity of check         check = not (check) Â
    # Checks if arr[] cannot be     # modified, then returns false     if not exists:         arr = cpy         return False                       # Otherwise, return True     else :         return True Â
# Function to rotate the digits of array # elements such that array elements are # in the form of even-odd or odd-even form def convert_arr(arr): Â
    # If array elements can be arranged     # in even-odd manner alternately     if (is_possible(arr, 0 )):         print ( * arr) Â
    # If array elements can be arranged     # in odd-even manner alternately     elif (is_possible(arr, 1 )):         print ( * arr)              # Otherwise, prints -1     else :         print ( - 1 ) Â
# Driver Code if __name__ = = '__main__' : Â Â Â Â Â Â Â Â Â arr = [ 143 , 251 , 534 , 232 , 854 ] Â Â Â Â convert_arr(arr) Â
    # This code is contributed by ipg2016107. |
C#
// C# program of the above approach using System; using System.Collections.Generic; Â
Â
class GFG{ Â Â Â // Utility function to rotate the digits of // array elements such that array elements are // in placed even-odd or odd-even alternately static bool ispossible(List< int > arr, bool check) { Â
    // Checks if array can be converted     // into even-odd or odd-even form     bool exists = true ; Â
    // Store array elements     List< int > cpy = arr;     bool flag;     // Traverse the array     for ( int i=0;i<arr.Count;i++) { Â
        // Check if arr[i] is already         // at correct position         int temp = check ? 1 : 0;         if (arr[i] % 2 == temp) {             check = !(check);             continue ;         } Â
        // Checks if it is possible         // to modify the number arr[i]         // by rotating the digits of         // the number anticlockwise         flag = false ; Â
        // Stores the number arr[i] as         // string         int p = arr[i];         string strEle = p.ToString(); Â
        // Traverse over the digits of         // the current element         for ( int j = 0; j < strEle.Length; j++) { Â
            // Checks if parity of check and             // current digit is same or not              temp = check ? 1 : 0;             if (( int )(strEle[j] - '0' )% 2 == temp) { Â
                // Rotates the string by j + 1 times                 // in anticlockwise                 string s = strEle.Substring(j + 1) + strEle.Substring(0, j + 1);                 arr[i] = Int32.Parse(s);                                  // Marks the flag                 // as true and break                 flag = true ;                 break ;             }         } Â
        // If flag is false         if (flag == false ) {             // Update exists             exists = false ;             break ;         } Â
        // Changes the         // parity of check         check = !(check);     } Â
    // Checks if arr[] cannot be     // modified, then returns false     if (exists== false ) {         arr = cpy;         return false ;     } Â
    // Otherwise, return true     else         return true ; } Â
// Function to rotate the digits of array // elements such that array elements are // in the form of even-odd or odd-even form static void convert_arr(List< int > arr) { Â
    // If array elements can be arranged     // in even-odd manner alternately     if (ispossible(arr, false )) {         foreach ( int i in arr)             Console.Write(i + " " );     } Â
    // If array elements can be arranged     // in odd-even manner alternately     else if (ispossible(arr, true )) {         foreach ( int i in arr)            Console.Write(i + " " );     } Â
    // Otherwise, prints -1     else         Console.Write( "-1" ); } Â
// Driver Code public static void Main() { Â Â Â Â List< int > arr = new List< int >(){143, 251, 534, 232, 854}; Â Â Â Â convert_arr(arr); } } |
Javascript
<script> Â
    // JavaScript program of the above approach Â
    // Utility function to rotate the digits of     // array elements such that array elements are     // in placed even-odd or odd-even alternately     function is_possible(arr,check)     { Â
        // Checks if array can be converted         // into even-odd or odd-even form         let exists = true ; Â
        // Store array elements         let cpy = arr;           let flag;         // Traverse the array         for (let i = 0; i < arr.length; i++) { Â
            // Check if arr[i] is already             // at correct position             if (arr[i] % 2 == check) {                 check = !(check);                 continue ;             } Â
            // Checks if it is possible             // to modify the number arr[i]             // by rotating the digits of             // the number anticlockwise             flag = false ; Â
            // Stores the number arr[i] as             // string             let strEle = arr[i].toString(); Â
            // Traverse over the digits of             // the current element             for (let j = 0; j < strEle.length; j++) { Â
                // Checks if parity of check and                 // current digit is same or not                 if (strEle[j].charCodeAt() % 2 == check) { Â
                    // Rotates the string by j + 1 times                     // in anticlockwise                     arr[i] = parseInt(strEle.substr(j + 1)                                 + strEle.substr(0, j + 1)); Â
                    // Marks the flag                     // as true and break                     flag = true ;                     break ;                 }             } Â
            // If flag is false             if (flag == false ) {                 // Update exists                 exists = false ;                 break ;             } Â
            // Changes the             // parity of check             check = !(check);         } Â
        // Checks if arr[] cannot be         // modified, then returns false         if (!exists) {             arr = cpy;             return false ;         } Â
        // Otherwise, return true         else             return true ;     } Â
    // Function to rotate the digits of array     // elements such that array elements are     // in the form of even-odd or odd-even form     function convert_arr(arr)     { Â
        // If array elements can be arranged         // in even-odd manner alternately         if (is_possible(arr, 0)) {             for (let i = 0; i < arr.length; i++)                 document.write(arr[i] + " " );         } Â
        // If array elements can be arranged         // in odd-even manner alternately         else if (is_possible(arr, 1)) {             for (let i = 0; i < arr.length; i++)                 document.write(arr[i] + " " );         } Â
        // Otherwise, prints -1         else           document.write( "-1" );     } Â
    // Driver Code Â
Â
    let arr = [ 143, 251, 534, 232, 854 ];     convert_arr(arr);      </script> |
314 251 534 223 854
Â
Time Complexity: O(N), as we are using a loop to traverse N times.
Auxiliary Space: O(N), as we are using  extra space for cpy.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!