Find the maximum number formed by swapping digits of same parity
Last Updated :
01 Jul, 2022
Given a number N, the task is to maximize this number by following the given conditions:
- The odd digit of the number can only be swapped by any odd digit present in the given number.
- The even digit of the number can only be swapped by any even digit present in the given number.
Examples:
Input: N = 234
Output: 432
Explanation: The 0th index is swapped with 2nd index.
Input: N = 6587
Output: 8765
Explanation: The 0th index is swapped with 2nd index.
The 1st index is swapped with 3rd index.
Naive approach: If a digit in the given number N is even then find the greatest element to its right which is also even and finally swap both. similarly do the same, if the digit is odd.
Follow the steps mentioned below to implement the idea:
- Convert the given number N into string s (This will make traversing on each digit of the number easy)
- Iterate the string from 0 to s.length()-1:
- Use variables to store the maximum value to the right of current index (say maxi) and its position (say idx).
- Iterate the string from j = i+1 to s.length()-1
- If both ith digit and jth digit is of the same parity and jth digit is greater than ith, then update the maxi and idx.
- Otherwise, continue the iteration.
- Finally swap s[i] with s[idx]
- Return the integer value of the string s.
Below is the implementation of the above approach.
C++
#include <bits/stdc++.h>
using namespace std;
int maximizedNumber( int num)
{
string s = to_string(num);
for ( int i = 0; i < s.length(); i++) {
int maxi = s[i] - '0' ;
int idx = i;
for ( int j = i + 1; j < s.length();
j++) {
if (maxi % 2 == 0
&& (s[j] - '0' ) % 2 == 0) {
if (s[j] - '0' > maxi) {
maxi = s[j] - '0' ;
idx = j;
}
}
else if (maxi % 2 == 1
&& (s[j] - '0' ) % 2 == 1) {
if (s[j] - '0' > maxi) {
maxi = s[j] - '0' ;
idx = j;
}
}
}
swap(s[i], s[idx]);
}
return stoi(s);
}
int main()
{
int N = 6587;
cout << maximizedNumber(N);
return 0;
}
|
Java
import java.io.*;
import java.util.*;
class GFG {
static String swap(String str, int i, int j)
{
StringBuilder sb = new StringBuilder(str);
sb.setCharAt(i, str.charAt(j));
sb.setCharAt(j, str.charAt(i));
return sb.toString();
}
public static int maximizedNumber( int num)
{
String s = Integer.toString(num);
for ( int i = 0 ; i < s.length(); i++) {
int maxi = s.charAt(i) - '0' ;
int idx = i;
for ( int j = i + 1 ; j < s.length(); j++) {
if (maxi % 2 == 0
&& (s.charAt(j) - '0' ) % 2 == 0 ) {
if (s.charAt(j) - '0' > maxi) {
maxi = s.charAt(j) - '0' ;
idx = j;
}
}
else if (maxi % 2 == 1
&& (s.charAt(j) - '0' ) % 2 == 1 ) {
if (s.charAt(j) - '0' > maxi) {
maxi = s.charAt(j) - '0' ;
idx = j;
}
}
}
s = swap(s, i, idx);
}
return Integer.parseInt(s);
}
public static void main(String[] args)
{
int N = 6587 ;
System.out.print(maximizedNumber(N));
}
}
|
Python3
def maximizedNumber(num):
s = list ( str (num))
for i in range ( len (s)):
maxi = int (s[i])
idx = i
for j in range (i + 1 , len (s)):
if ((maxi % 2 = = 0 ) and ( int (s[j]) % 2 = = 0 )):
if ( int (s[j]) > maxi):
maxi = int (s[j])
idx = j
elif ((maxi % 2 = = 1 ) and ( int (s[j]) % 2 = = 1 )):
if ( int (s[j]) > maxi):
maxi = int (s[j])
idx = j
s[i],s[idx] = s[idx],s[i]
return ''.join(s)
N = 6587
print (maximizedNumber(N))
|
C#
using System;
public class GFG
{
public static int maximizedNumber( int num)
{
string s = num.ToString();
for ( int i = 0; i < s.Length; i++) {
int maxi = s[i] - '0' ;
int idx = i;
for ( int j = i + 1; j < s.Length; j++) {
if (maxi % 2 == 0
&& (s[j] - '0' ) % 2 == 0) {
if (s[j] - '0' > maxi) {
maxi = s[j] - '0' ;
idx = j;
}
}
else if (maxi % 2 == 1
&& (s[j] - '0' ) % 2 == 1) {
if (s[j] - '0' > maxi) {
maxi = s[j] - '0' ;
idx = j;
}
}
}
string swap = s.Substring(i, 1);
s = s.Remove(i, 1).Insert(i,
s.Substring(idx, 1));
s = s.Remove(idx, 1).Insert(idx, swap);
}
return Int32.Parse(s);
}
public static void Main( string [] args)
{
int N = 6587;
Console.WriteLine(maximizedNumber(N));
}
}
|
Javascript
<script>
function maximizedNumber(num)
{
var s = num.toString().split( '' );
for ( var i = 0; i < s.length; i++) {
var maxi = parseInt(s[i]);
var idx = i;
for ( var j = i + 1; j < s.length;
j++) {
if ((maxi % 2 == 0)
&& (parseInt(s[j]) % 2 == 0)) {
if (parseInt(s[j]) > maxi) {
maxi = parseInt(s[j]);
idx = j;
}
}
else if ((maxi % 2 == 1)
&& (parseInt(s[j])) % 2 == 1) {
if (parseInt(s[j]) > maxi) {
maxi = parseInt(s[j]);
idx = j;
}
}
}
var temp = s[i];
s[i] = s[idx];
s[idx] = temp;
}
return (s.join( '' ));
}
var N = 6587;
document.write(maximizedNumber(N));
</script>
|
Time Complexity: O(N2), Where N is the length of the given string.
Auxiliary Space: O(N)
Efficient approach: This problem can be solved efficiently based on the following idea:
Store all even digits in non-increasing order and do the same for odd digits.
Now replace all stored even digits of given number in non-increasing order with even digits in it and do the same for odd digits.
Follow the steps mentioned below to implement the idea.
- Convert given number N into string s.
- Iterate over s and do the following:
- Store all even digits in a string (say evenDigit) and all odd digits in another string (say oddDigit).
- Sort both the strings in non-increasing order.
- Iterate over s and do the following:
- Use two iterators (say itr1 and itr2) to point to the next even or odd digit to be picked.
- If the digit in s is even, then replace it with the digit in evenDigit[itr1] and increment itr1.
- If the digit in s is odd, then replace it with the digit in oddDigit[itr2] and increment itr2.
- Finally, convert the string s into an integer and return it.
Below is the implementation of the above approach.
C++
#include <bits/stdc++.h>
using namespace std;
int maximizedNumber( int num)
{
string oddDigit = "" ;
string evenDigit = "" ;
string s = to_string(num);
for ( int i = 0; i < s.size(); i++) {
if ((s[i] - '0' ) % 2 == 0) {
evenDigit += s[i];
}
else {
oddDigit += s[i];
}
}
sort(oddDigit.begin(), oddDigit.end(),
greater< int >());
sort(evenDigit.begin(), evenDigit.end(),
greater< int >());
int i1 = 0, j1 = 0;
for ( int i = 0; i < s.size(); i++) {
if ((s[i] - '0' ) % 2 == 0) {
s[i] = evenDigit[i1];
i1++;
}
else {
s[i] = oddDigit[j1];
j1++;
}
}
return stoi(s);
}
int main()
{
int N = 6587;
cout << maximizedNumber(N);
return 0;
}
|
Java
import java.util.*;
class charSort implements Comparator<Character> {
@Override public int compare(Character c1, Character c2)
{
return Character.compare(Character.toLowerCase(c2),
Character.toLowerCase(c1));
}
};
class GFG {
static int maximizedNumber( int num)
{
ArrayList<Character> oddDigit
= new ArrayList<Character>();
ArrayList<Character> evenDigit
= new ArrayList<Character>();
char [] s = (String.valueOf(num)).toCharArray();
for ( int i = 0 ; i < s.length; i++) {
if ((s[i] - '0' ) % 2 == 0 ) {
evenDigit.add(s[i]);
}
else {
oddDigit.add(s[i]);
}
}
oddDigit.sort( new charSort());
evenDigit.sort( new charSort());
int i1 = 0 , j1 = 0 ;
for ( int i = 0 ; i < s.length; i++) {
if ((s[i] - '0' ) % 2 == 0 ) {
s[i] = evenDigit.get(i1);
i1++;
}
else {
s[i] = oddDigit.get(j1);
j1++;
}
}
return Integer.parseInt( new String(s));
}
public static void main(String[] args)
{
int N = 6587 ;
System.out.println(maximizedNumber(N));
}
}
|
Python3
def maximizedNumber(num):
oddDigit = "";
evenDigit = "";
s = list ( str (num))
for i in range ( len (s)):
if ( int (s[i]) % 2 = = 0 ):
evenDigit + = s[i];
else :
oddDigit + = s[i];
oddDigit = list (oddDigit)
evenDigit = list (evenDigit)
oddDigit.sort();
oddDigit.reverse();
evenDigit.sort();
evenDigit.reverse();
i1 = 0 ;
j1 = 0 ;
for i in range ( len (s)):
if ( int (s[i]) % 2 = = 0 ):
s[i] = evenDigit[i1];
i1 + = 1
else :
s[i] = oddDigit[j1];
j1 + = 1
return "".join(s)
N = 6587 ;
print (maximizedNumber(N));
|
C#
using System;
using System.Collections.Generic;
class charSort : Comparer< char > {
public override int Compare( char c1, char c2)
{
return (Char.ToLower(c2))
.CompareTo(Char.ToLower(c1));
}
};
class GFG {
static int maximizedNumber( int num)
{
List< char > oddDigit = new List< char >();
List< char > evenDigit = new List< char >();
char [] s = (num.ToString()).ToCharArray();
for ( int i = 0; i < s.Length; i++) {
if ((s[i] - '0' ) % 2 == 0) {
evenDigit.Add(s[i]);
}
else {
oddDigit.Add(s[i]);
}
}
oddDigit.Sort( new charSort());
evenDigit.Sort( new charSort());
int i1 = 0, j1 = 0;
for ( int i = 0; i < s.Length; i++) {
if ((s[i] - '0' ) % 2 == 0) {
s[i] = evenDigit[i1];
i1++;
}
else {
s[i] = oddDigit[j1];
j1++;
}
}
return int .Parse(s);
}
public static void Main( string [] args)
{
int N = 6587;
Console.WriteLine(maximizedNumber(N));
}
}
|
Javascript
<script>
function maximizedNumber(num)
{
var oddDigit = "" ;
var evenDigit = "" ;
var s = num.toString().split( "" );
for ( var i = 0; i < s.length; i++) {
if (parseInt(s[i]) % 2 == 0) {
evenDigit += s[i];
}
else {
oddDigit += s[i];
}
}
oddDigit = oddDigit.split( "" );
evenDigit = evenDigit.split( "" );
oddDigit.sort();
oddDigit.reverse();
evenDigit.sort();
evenDigit.reverse();
var i1 = 0;
var j1 = 0;
for ( var i = 0; i < s.length; i++) {
if (parseInt(s[i]) % 2 == 0) {
s[i] = evenDigit[i1];
i1++;
}
else {
s[i] = oddDigit[j1];
j1++;
}
}
return s.join( "" );
}
var N = 6587;
document.write(maximizedNumber(N));
</script>
|
Time Complexity: O(M * log M), Where M is the number of digits present in N.
Auxiliary Space: O(M)
Share your thoughts in the comments
Please Login to comment...