Encuentre el número máximo formado por el intercambio de dígitos de la misma paridad

Dado un número N, la tarea es maximizar este número siguiendo las condiciones dadas:

  • El dígito impar del número solo se puede intercambiar por cualquier dígito impar presente en el número dado.
  • El dígito par del número solo se puede intercambiar por cualquier dígito par presente en el número dado.

Ejemplos:

Entrada: N = 234
Salida: 432
Explicación: El índice 0 se intercambia con el índice 2.

Entrada: N = 6587
Salida : 8765
Explicación: El índice 0 se intercambia con el índice 2.
El primer índice se intercambia con el tercer índice.

 

Enfoque ingenuo: si un dígito en el número dado N es par , encuentre el elemento más grande a su derecha que también es par y finalmente intercambie ambos . haz lo mismo, si el dígito es impar.

Siga los pasos mencionados a continuación para implementar la idea:

  • Convierta el número N dado en una string s (esto facilitará el desplazamiento de cada dígito del número)
  • Iterar la string de 0 a s.length()-1 :
    • Use variables para almacenar el valor máximo a la derecha del índice actual (digamos maxi ) y su posición (digamos idx ).
    • Iterar la string de j = i+1 a s.length()-1
      • Si tanto el i- ésimo dígito como el j-ésimo dígito tienen la misma paridad y el j-ésimo dígito es mayor que el i-ésimo , actualice maxi e idx .
      • De lo contrario, continúa con la iteración.
    • Finalmente intercambie s[i] con s[idx]
  • Devuelve el valor entero de la string s .

C++

// C++ code to implement the approach
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to maximize the number
int maximizedNumber(int num)
{
    // String will be used to represent the
    // number in string
    string s = to_string(num);
 
    // Traversing the string
    for (int i = 0; i < s.length(); i++) {
        int maxi = s[i] - '0';
        int idx = i;
 
        // Check ith digit with all
        // the remaining unoperated
        // string to maximize the string
        for (int j = i + 1; j < s.length();
             j++) {
 
            // If both the ith and
            // jth digit is odd
            if (maxi % 2 == 0
                && (s[j] - '0') % 2 == 0) {
 
                // If the jth digit is
                // greater than the ith digit
                if (s[j] - '0' > maxi) {
                    maxi = s[j] - '0';
                    idx = j;
                }
            }
 
            // If both ith and
            // jth digit is even
            else if (maxi % 2 == 1
                     && (s[j] - '0') % 2 == 1) {
 
                // If the jth digit is
                // greater than ith digit.
                if (s[j] - '0' > maxi) {
                    maxi = s[j] - '0';
                    idx = j;
                }
            }
        }
 
        // Swap the largest digit to the right
        // of ith digit with ith digit
        swap(s[i], s[idx]);
    }
 
    // Convert string into integer
    return stoi(s);
}
 
// Driver code
int main()
{
    int N = 6587;
 
    // Function call
    cout << maximizedNumber(N);
    return 0;
}

Java

// Java code to implement the approach
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();
  }
 
  // Function to maximize the number
  public static int maximizedNumber(int num)
  {
    // String will be used to represent the
    // number in string
    String s = Integer.toString(num);
 
    // Traversing the string
    for (int i = 0; i < s.length(); i++) {
      int maxi = s.charAt(i) - '0';
      int idx = i;
 
      // Check ith digit with all
      // the remaining unoperated
      // string to maximize the string
      for (int j = i + 1; j < s.length(); j++) {
 
        // If both the ith and
        // jth digit is odd
        if (maxi % 2 == 0
            && (s.charAt(j) - '0') % 2 == 0) {
 
          // If the jth digit is
          // greater than the ith digit
          if (s.charAt(j) - '0' > maxi) {
            maxi = s.charAt(j) - '0';
            idx = j;
          }
        }
 
        // If both ith and
        // jth digit is even
        else if (maxi % 2 == 1
                 && (s.charAt(j) - '0') % 2 == 1) {
 
          // If the jth digit is
          // greater than ith digit.
          if (s.charAt(j) - '0' > maxi) {
            maxi = s.charAt(j) - '0';
            idx = j;
          }
        }
      }
 
      // Swap the largest digit to the right
      // of ith digit with ith digit
      s = swap(s, i, idx);
    }
 
    // Convert string into integer
    return Integer.parseInt(s);
  }
 
  public static void main(String[] args)
  {
    int N = 6587;
 
    // Function call
    System.out.print(maximizedNumber(N));
  }
}
 
// This code is contributed by Rohit Pradhan

Python3

# Python code to implement the approach
 
# Function to maximize the number
def maximizedNumber(num):
 
    # Array String will be used to represent the
    # number in string
    s = list(str(num))
 
    # Traversing the string
    for i in range(len(s)):
        maxi = int(s[i])
        idx = i
 
        # Check ith digit with all
        # the remaining unoperated
        # string to maximize the string
        for j in range(i + 1,len(s)):
 
            # If both the ith and
            # jth digit is odd
            if ((maxi % 2 == 0) and (int(s[j]) % 2 == 0)):
 
                # If the jth digit is
                # greater than the ith digit
                if (int(s[j]) > maxi):
                    maxi = int(s[j])
                    idx = j
 
            # If both ith and
            # jth digit is even
            elif ((maxi % 2 == 1) and (int(s[j]) % 2 == 1)):
 
                # If the jth digit is
                # greater than ith digit.
                if (int(s[j]) > maxi):
                    maxi = int(s[j])
                    idx = j
 
        # Swap the largest digit to the right
        # of ith digit with ith digit
        s[i],s[idx] = s[idx],s[i]
 
    # Convert string into integer
    return ''.join(s)
 
# Driver code
N = 6587
 
# Function call
print(maximizedNumber(N))
 
# This code is contributed by shinjanpatra

C#

// C# code to implement the approach
using System;
 
public class GFG
{
   
  // Function to maximize the number
  public static int maximizedNumber(int num)
  {
     
    // String will be used to represent the
    // number in string
    string s = num.ToString();
 
    // Traversing the string
    for (int i = 0; i < s.Length; i++) {
      int maxi = s[i] - '0';
      int idx = i;
 
      // Check ith digit with all
      // the remaining unoperated
      // string to maximize the string
      for (int j = i + 1; j < s.Length; j++) {
 
        // If both the ith and
        // jth digit is odd
        if (maxi % 2 == 0
            && (s[j] - '0') % 2 == 0) {
 
          // If the jth digit is
          // greater than the ith digit
          if (s[j] - '0' > maxi) {
            maxi = s[j] - '0';
            idx = j;
          }
        }
 
        // If both ith and
        // jth digit is even
        else if (maxi % 2 == 1
                 && (s[j] - '0') % 2 == 1) {
 
          // If the jth digit is
          // greater than ith digit.
          if (s[j] - '0' > maxi) {
            maxi = s[j] - '0';
            idx = j;
          }
        }
      }
 
      // Swap the largest digit to the right
      // of ith digit with ith digit
      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);
    }
 
    // Convert string into integer
    return Int32.Parse(s);
  }
  public static void Main(string[] args)
  {
    int N = 6587;
 
    // Function call
    Console.WriteLine(maximizedNumber(N));
  }
}
 
// This code is contributed by phasing17

Javascript

<script>
// JavaScript code to implement the approach
 
// Function to maximize the number
function maximizedNumber(num)
{
    // Array String will be used to represent the
    // number in string
    var s = num.toString().split('');
 
    // Traversing the string
    for (var i = 0; i < s.length; i++) {
        var maxi = parseInt(s[i]);
        var idx = i;
 
        // Check ith digit with all
        // the remaining unoperated
        // string to maximize the string
        for (var j = i + 1; j < s.length;
             j++) {
 
            // If both the ith and
            // jth digit is odd
            if ((maxi % 2 == 0)
                && (parseInt(s[j]) % 2 == 0)) {
 
                // If the jth digit is
                // greater than the ith digit
                if (parseInt(s[j]) > maxi) {
                    maxi = parseInt(s[j]);
                    idx = j;
                }
            }
 
            // If both ith and
            // jth digit is even
            else if ((maxi % 2 == 1)
                     && (parseInt(s[j])) % 2 == 1) {
 
                // If the jth digit is
                // greater than ith digit.
                if (parseInt(s[j]) > maxi) {
                    maxi = parseInt(s[j]);
                    idx = j;
                }
            }
        }
 
        // Swap the largest digit to the right
        // of ith digit with ith digit
        var temp = s[i];
        s[i] = s[idx];
        s[idx] = temp;
    }
 
    // Convert string into integer
    return (s.join(''));
}
 
// Driver code
var N = 6587;
 
// Function call
document.write(maximizedNumber(N));
 
// This code is contributed by phasing17
</script>
Producción

8765

Complejidad del tiempo:
Espacio Auxiliar:

Siga los pasos mencionados a continuación para implementar la idea.

  • Convierta el número dado N en la string s .
  • Iterar sobre s y hacer lo siguiente:
    • Almacene todos los dígitos pares en una string (por ejemplo, evenDigit ) y todos los dígitos impares en otra string (por ejemplo, oddDigit ).
    • Ordene ambas strings en orden no creciente.
  • Iterar sobre s y hacer lo siguiente:
    • Utilice dos iteradores (por ejemplo, itr1 e itr2 ) para señalar el siguiente dígito par o impar que se va a elegir.
    • Si el dígito en s es par, reemplácelo con el dígito en evenDigit[itr1] e incremente itr1. 
    • Si el dígito en s es impar, reemplácelo con el dígito en oddDigit[itr2] e incremente itr2.
  • Finalmente, convierta la string s en un número entero y devuélvalo.

C++

// C++ code to implement the approach
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to maximize the number
int maximizedNumber(int num)
{
    // Store all even digits
    string oddDigit = "";
 
    // Store all odd digits
    string evenDigit = "";
 
    // Convert given number into string
    string s = to_string(num);
 
    for (int i = 0; i < s.size(); i++) {
        // Check if digit is even or odd
        if ((s[i] - '0') % 2 == 0) {
            evenDigit += s[i];
        }
        else {
            oddDigit += s[i];
        }
    }
 
    // Sort oddDigit and evenDigit string
    // in non-increasing order.
    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 the current digit is even
        // then replace it with evenDigit[i1]
        if ((s[i] - '0') % 2 == 0) {
            s[i] = evenDigit[i1];
            i1++;
        }
 
        // If the current digit is odd then
        // replace it with the oddDigit[j1]
        else {
            s[i] = oddDigit[j1];
            j1++;
        }
    }
 
    return stoi(s);
}
 
// Driver code
int main()
{
    int N = 6587;
 
    // Function call
    cout << maximizedNumber(N);
    return 0;
}

Java

// Java code to implement the approach
import java.util.*;
 
// Helper class implementing Comparator interface
// to compare characters of a string in non
// increasing order
class charSort implements Comparator<Character> {
 
  @Override public int compare(Character c1, Character c2)
  {
    // Ignoring case
    return Character.compare(Character.toLowerCase(c2),
                             Character.toLowerCase(c1));
  }
};
 
class GFG {
 
  // Function to maximize the number
  static int maximizedNumber(int num)
  {
    // Store all even digits
    ArrayList<Character> oddDigit
      = new ArrayList<Character>();
 
    // Store all odd digits
    ArrayList<Character> evenDigit
      = new ArrayList<Character>();
 
    // Convert given number into char array
    char[] s = (String.valueOf(num)).toCharArray();
 
    for (int i = 0; i < s.length; i++) {
      // Check if digit is even or odd
      if ((s[i] - '0') % 2 == 0) {
        evenDigit.add(s[i]);
      }
      else {
        oddDigit.add(s[i]);
      }
    }
 
    // Sort oddDigit and evenDigit string
    // in non-increasing order.
    oddDigit.sort(new charSort());
    evenDigit.sort(new charSort());
 
    int i1 = 0, j1 = 0;
 
    for (int i = 0; i < s.length; i++) {
 
      // If the current digit is even
      // then replace it with evenDigit[i1]
      if ((s[i] - '0') % 2 == 0) {
        s[i] = evenDigit.get(i1);
        i1++;
      }
 
      // If the current digit is odd then
      // replace it with the oddDigit[j1]
      else {
        s[i] = oddDigit.get(j1);
        j1++;
      }
    }
 
    return Integer.parseInt(new String(s));
  }
 
  // Driver Code
  public static void main(String[] args)
  {
    int N = 6587;
 
    // Function call
    System.out.println(maximizedNumber(N));
  }
}
 
// This code is contributed by phasing17

Python3

# Python3 code to implement the approach
 
# Function to maximize the number
def maximizedNumber(num):
 
    # Store all even digits
    oddDigit = "";
 
    # Store all odd digits
    evenDigit = "";
 
    # Convert given number into string
    s = list(str(num))
 
    for i in range(len(s)):
        # Check if digit is even or odd
        if (int(s[i]) % 2 == 0):
            evenDigit += s[i];
         
        else:
            oddDigit += s[i];
     
    oddDigit = list(oddDigit)
    evenDigit = list(evenDigit)
     
    # Sort oddDigit and evenDigit string
    # in non-increasing order.
    oddDigit.sort();
    oddDigit.reverse();
    evenDigit.sort();
    evenDigit.reverse();
 
    i1 = 0;
    j1 = 0;
 
    for i in range(len(s)):
 
        # If the current digit is even
        # then replace it with evenDigit[i1]
        if (int(s[i]) % 2 == 0):
            s[i] = evenDigit[i1];
            i1 += 1
         
 
        # If the current digit is odd then
        # replace it with the oddDigit[j1]
        else :
            s[i] = oddDigit[j1];
            j1 += 1
 
    return "".join(s)
 
# Driver code
N = 6587;
 
#Function call
print(maximizedNumber(N));
 
# This code is contributed by phasing17

C#

// C# code to implement the approach
using System;
using System.Collections.Generic;
 
// Helper class implementing Comparator interface
// to compare characters of a string in non
// increasing order
class charSort : Comparer<char> {
 
  public override int Compare(char c1, char c2)
  {
    // Ignoring case
    return (Char.ToLower(c2))
      .CompareTo(Char.ToLower(c1));
  }
};
 
 
class GFG {
 
  // Function to maximize the number
  static int maximizedNumber(int num)
  {
    // Store all even digits
    List<char> oddDigit = new List<char>();
 
    // Store all odd digits
    List<char> evenDigit = new List<char>();
 
    // Convert given number into char array
    char[] s = (num.ToString()).ToCharArray();
 
    for (int i = 0; i < s.Length; i++) {
      // Check if digit is even or odd
      if ((s[i] - '0') % 2 == 0) {
        evenDigit.Add(s[i]);
      }
      else {
        oddDigit.Add(s[i]);
      }
    }
 
    // Sort oddDigit and evenDigit string
    // in non-increasing order.
    oddDigit.Sort(new charSort());
    evenDigit.Sort(new charSort());
 
    int i1 = 0, j1 = 0;
 
    for (int i = 0; i < s.Length; i++) {
 
      // If the current digit is even
      // then replace it with evenDigit[i1]
      if ((s[i] - '0') % 2 == 0) {
        s[i] = evenDigit[i1];
        i1++;
      }
 
      // If the current digit is odd then
      // replace it with the oddDigit[j1]
      else {
        s[i] = oddDigit[j1];
        j1++;
      }
    }
 
    return int.Parse(s);
  }
 
  // Driver Code
  public static void Main(string[] args)
  {
    int N = 6587;
 
    // Function call
    Console.WriteLine(maximizedNumber(N));
  }
}
 
// This code is contributed by phasing17

Javascript

<script>
// JavaScript code to implement the approach
 
// Function to maximize the number
function maximizedNumber(num)
{
    // Store all even digits
    var oddDigit = "";
 
    // Store all odd digits
    var evenDigit = "";
 
    // Convert given number into string
    var s = num.toString().split("");
 
    for (var i = 0; i < s.length; i++) {
        // Check if digit is even or odd
        if (parseInt(s[i]) % 2 == 0) {
            evenDigit += s[i];
        }
        else {
            oddDigit += s[i];
        }
    }
     
    oddDigit = oddDigit.split("");
    evenDigit = evenDigit.split("");
     
    // Sort oddDigit and evenDigit string
    // in non-increasing order.
    oddDigit.sort();
    oddDigit.reverse();
    evenDigit.sort();
    evenDigit.reverse();
 
    var i1 = 0;
    var j1 = 0;
 
    for (var i = 0; i < s.length; i++) {
 
        // If the current digit is even
        // then replace it with evenDigit[i1]
        if (parseInt(s[i]) % 2 == 0) {
            s[i] = evenDigit[i1];
            i1++;
        }
 
        // If the current digit is odd then
        // replace it with the oddDigit[j1]
        else {
            s[i] = oddDigit[j1];
            j1++;
        }
    }
 
    return s.join("");
}
 
// Driver code
var N = 6587;
 
// Function call
document.write(maximizedNumber(N));
 
// This code is contributed by phasing17
</script>
Producción

8765

Complejidad del tiempo:
Espacio Auxiliar:

Publicación traducida automáticamente

Artículo escrito por prathamjha5683 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *