Rearrange array elements into alternate even-odd sequence by anticlockwise rotation of digits

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 alternatelybool 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 formvoid 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 Codeint 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 approachimport 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 alternatelydef 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 formdef 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 Codeif __name__ == '__main__':Â Â Â Â Â Â Â Â Â arr = [143, 251, 534, 232, 854]Â Â Â Â convert_arr(arr)Â
    # This code is contributed by ipg2016107. |
C#
// C# program of the above approachusing 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 alternatelystatic 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 formstatic 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 Codepublic 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 zambiatek!



