给定一个字符串形式的整数N ,任务是在允许您进行任意数量的交换(交换数字的位数)时,从给定的数字中找到最大的偶数。如果无法形成偶数,则打印-1 。
例子:
Input: N = 1324
Output: 4312
Input: N = 135
Output: -1
No even number can be formed using odd digits.
方法:按降序对字符串进行排序,然后我们将使用给定的数字获得最大的数字,但它可能是偶数,也可能不是。为了使它成为偶数(如果还没有),必须将数字中的偶数数字与最后一位数字交换,并且为了使偶数最大化,要交换的偶数数字必须与数字中的最小偶数数字交换。数字。
注意,可以使用频率数组对数字的位数在线性时间内进行排序,因为在最坏的情况下,需要排序的不同元素的数量最多为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)