📌  相关文章
📜  任意数量的互换可以形成的最大偶数

📅  最后修改于: 2021-04-21 21:00:37             🧑  作者: Mango

给定一个字符串形式的整数N ,任务是在允许您进行任意数量的交换(交换数字的位数)时,从给定的数字中找到最大的偶数。如果无法形成偶数,则打印-1

例子:

方法:按降序对字符串进行排序,然后我们将使用给定的数字获得最大的数字,但它可能是偶数,也可能不是。为了使它成为偶数(如果还没有),必须将数字中的偶数数字与最后一位数字交换,并且为了使偶数最大化,要交换的偶数数字必须与数字中的最小偶数数字交换。数字。

注意,可以使用频率数组对数字的位数在线性时间内进行排序,因为在最坏的情况下,需要排序的不同元素的数量最多为10

下面是上述方法的实现:

C++
// C++ implementation of the approach
#include 
using namespace std;
const int MAX = 10;
 
// Function to return the maximum
// even number that can be formed
// with any number of digit swaps
string getMaxEven(string str, int len)
{
 
    // To store the frequencies of
    // all the digits
    int freq[MAX] = { 0 };
 
    // To store the minimum even digit
    // and the minimum overall digit
    int i, minEvenDigit = MAX;
    for (i = 0; i < len; i++) {
        int digit = str[i] - '0';
        freq[digit]++;
 
        // If digit is even then update
        // the minimum even digit
        if (digit % 2 == 0)
            minEvenDigit = min(digit, minEvenDigit);
    }
 
    // If there is no even digit then
    // it is not possible to generate
    // an even number with swaps
    if (minEvenDigit == MAX)
        return "-1";
 
    // Decrease the frequency of the
    // digits that need to be swapped
    freq[minEvenDigit]--;
 
    i = 0;
    // Take every digit starting from the maximum
    // in order to maximize the number
    for (int j = MAX - 1; j >= 0; j--) {
 
        // Take current digit number of times
        // it appeared in the original number
        for (int k = 0; k < freq[j]; k++)
            str[i++] = (char)(j + '0');
    }
 
    // Append once instance of the minimum
    // even digit in the end to make the number even
    str[i] = (char)(minEvenDigit + '0');
 
    return str;
}
 
// Driver code
int main()
{
    string str = "1023422";
    int len = str.length();
 
    // Function call
    cout << getMaxEven(str, len);
 
    return 0;
}


Java
// Java implementation of the approach
class GFG {
 
    static int MAX = 10;
 
    // Function to return the maximum
    // even number that can be formed
    // with any number of digit swaps
    static String getMaxEven(char[] str, int len)
    {
 
        // To store the frequencies of
        // all the digits
        int[] freq = new int[MAX];
 
        // To store the minimum even digit
        // and the minimum overall digit
        int i, minEvenDigit = MAX, minDigit = MAX;
        for (i = 0; i < len; i++) {
            int digit = str[i] - '0';
            freq[digit]++;
 
            // If digit is even then update
            // the minimum even digit
            if (digit % 2 == 0)
                minEvenDigit
                    = Math.min(digit, minEvenDigit);
 
            // Update the overall minimum digit
            minDigit = Math.min(digit, minDigit);
        }
 
        // If there is no even digit then
        // it is not possible to generate
        // an even number with swaps
        if (minEvenDigit == MAX)
            return "-1";
 
        // Decrease the frequency of the
        // digits that need to be swapped
        freq[minEvenDigit]--;
        freq[minDigit]--;
 
        i = 0;
 
        // Take every digit starting from the maximum
        // in order to maximize the number
        for (int j = MAX - 1; j >= 0; j--) {
 
            // Take current digit number of times
            // it appeared in the original number
            for (int k = 0; k < freq[j]; k++)
                str[i++] = (char)(j + '0');
 
            // If current digit equals to the
            // minimum even digit then one instance of it
            // needs to be swapped with the minimum overall
            // digit i.e. append the minimum digit here
            if (j == minEvenDigit)
                str[i++] = (char)(minDigit + '0');
        }
 
        // Append once instance of the minimum
        // even digit in the end to make the number even
        str[i - 1] = (char)(minEvenDigit + '0');
 
        return String.valueOf(str);
    }
 
    // Driver code
    public static void main(String[] args)
    {
        char[] str = "1023422".toCharArray();
        int len = str.length;
 
        // Function call
        System.out.println(getMaxEven(str, len));
    }
}
 
/* This code contributed by PrinciRaj1992 */


Python3
# Python3 implementation of the approach
 
MAX = 10
 
# Function to return the maximum
# even number that can be formed
# with any number of digit swaps
 
 
def getMaxEven(string, length):
 
    string = list(string)
 
    # To store the frequencies of
    # all the digits
    freq = [0]*MAX
 
    # To store the minimum even digit
    # and the minimum overall digit
    minEvenDigit = MAX
    minDigit = MAX
    for i in range(length):
        digit = ord(string[i]) - ord('0')
        freq[digit] += 1
 
        # If digit is even then update
        # the minimum even digit
        if (digit % 2 == 0):
            minEvenDigit = min(digit, minEvenDigit)
 
        # Update the overall minimum digit
        minDigit = min(digit, minDigit)
 
    # If there is no even digit then
    # it is not possible to generate
    # an even number with swaps
    if (minEvenDigit == MAX):
        return "-1"
 
    # Decrease the frequency of the
    # digits that need to be swapped
    freq[minEvenDigit] -= 1
    freq[minDigit] -= 1
 
    i = 0
 
    # Take every digit starting from the maximum
    # in order to maximize the number
    for j in range(MAX - 1, -1, -1):
 
        # Take current digit number of times
        # it appeared in the original number
        for k in range(freq[j]):
            string[i] = chr(j + ord('0'))
            i += 1
 
        # If current digit equals to the
        # minimum even digit then one instance of it
        # needs to be swapped with the minimum overall digit
        # i.e. append the minimum digit here
        if (j == minEvenDigit):
            string[i] = chr(minDigit + ord('0'))
            i += 1
 
    # Append once instance of the minimum
    # even digit in the end to make the number even
    #string.append(chr(minEvenDigit + ord('0')));
 
    return "".join(string)
 
 
# Driver code
if __name__ == "__main__":
    string = "1023422"
    length = len(string)
 
    # Function call
    print(getMaxEven(string, length))
 
# This code is contributed by AnkitRai01


C#
// C# implementation of the approach
using System;
 
class GFG {
 
    static int MAX = 10;
 
    // Function to return the maximum
    // even number that can be formed
    // with any number of digit swaps
    static String getMaxEven(char[] str, int len)
    {
 
        // To store the frequencies of
        // all the digits
        int[] freq = new int[MAX];
 
        // To store the minimum even digit
        // and the minimum overall digit
        int i, minEvenDigit = MAX, minDigit = MAX;
        for (i = 0; i < len; i++) {
            int digit = str[i] - '0';
            freq[digit]++;
 
            // If digit is even then update
            // the minimum even digit
            if (digit % 2 == 0)
                minEvenDigit
                    = Math.Min(digit, minEvenDigit);
 
            // Update the overall minimum digit
            minDigit = Math.Min(digit, minDigit);
        }
 
        // If there is no even digit then
        // it is not possible to generate
        // an even number with swaps
        if (minEvenDigit == MAX)
            return "-1";
 
        // Decrease the frequency of the
        // digits that need to be swapped
        freq[minEvenDigit]--;
        freq[minDigit]--;
 
        i = 0;
 
        // Take every digit starting from the maximum
        // in order to maximize the number
        for (int j = MAX - 1; j >= 0; j--) {
 
            // Take current digit number of times
            // it appeared in the original number
            for (int k = 0; k < freq[j]; k++)
                str[i++] = (char)(j + '0');
 
            // If current digit equals to the
            // minimum even digit then one instance of it
            // needs to be swapped with the minimum overall
            // digit i.e. append the minimum digit here
            if (j == minEvenDigit)
                str[i++] = (char)(minDigit + '0');
        }
 
        // Append once instance of the minimum
        // even digit in the end to make the number even
        str[i - 1] = (char)(minEvenDigit + '0');
 
        return String.Join("", str);
    }
 
    // Driver code
    public static void Main(String[] args)
    {
        char[] str = "1023422".ToCharArray();
        int len = str.Length;
 
        // Function call
        Console.WriteLine(getMaxEven(str, len));
    }
}
 
// This code has been contributed by 29AjayKumar


输出:
4322210


时间复杂度: O(n)