给定一个n个数字的数组。以产生最大价值的方式排列它们。在安排偶数相对于彼此的顺序和奇数相对于彼此的顺序时,应分别保持。
例子:
Input : {78, 81, 88, 79, 117, 56}
Output : 8179788856117
The numbers are arranged in the order:
81 79 78 88 56 117 and then
concatenated.
The odd numbers 81 79 117 and
The even numbers 78 88 56 maintain
their orders as in the original array.
Input : {400, 99, 76, 331, 65, 18}
Output : 99400763316518
该问题是对该问题的变体。将给定的数字排列为最大的数字。在这个问题中,我们找到了有一定限制的最大数,即在最终结果中需要保持奇数和偶数的顺序,因此旨在解决O(n)时间复杂度问题。
以下是查找最大数目保持奇数和偶数顺序的步骤。
- 将原始数组的数量分成2个数组even []和奇数[] 。在划分数字顺序时应保持。
- 合并偶数和奇数数组,并在合并时遵循条件。令X为一个数组的元素,Y为另一数组的元素。比较XY (Y附加到X)和YX (X附加到Y)。如果XY较大,则将X添加到最终结果中,否则将Y添加到最终结果中。
C++
// C++ implementation to form the biggest number
// by arranging numbers in certain order
#include
using namespace std;
// function to merge the even and odd list
// to form the biggest number
string merge(vector arr1, vector arr2)
{
int n1 = arr1.size();
int n2 = arr2.size();
int i = 0, j = 0;
// to store the final biggest number
string big = "";
while (i < n1 && j < n2)
{
// if true then add arr1[i] to big
if ((arr1[i]+arr2[j]).compare((arr2[j]+arr1[i])) > 0)
big += arr1[i++];
// else add arr2[j] to big
else
big += arr2[j++];
}
// add remaining elements
// of arr1 to big
while (i < n1)
big += arr1[i++];
// add remaining elements
// of arr2 to big
while (j < n2)
big += arr2[j++] ;
return big;
}
// function to find the biggest number
string printLargest(vector arr, int n)
{
vector even, odd;
for (int i=0; i arr;
arr.push_back("78");
arr.push_back("81");
arr.push_back("88");
arr.push_back("79");
arr.push_back("117");
arr.push_back("56");
int n = arr.size();
cout << "Biggest number = "
<< printLargest(arr, n);
return 0;
}
Java
import java.util.Vector;
// Java implementation to form the biggest number
// by arranging numbers in certain order
class GFG
{
// function to merge the even and odd list
// to form the biggest number
static String merge(Vector arr1,
Vector arr2)
{
int n1 = arr1.size();
int n2 = arr2.size();
int i = 0, j = 0;
// to store the final biggest number
String big = "";
while (i < n1 && j < n2)
{
// if true then add arr1[i] to big
if ((arr1.get(i) + arr2.get(j)).
compareTo((arr2.get(j) + arr1.get(i))) > 0)
{
big += arr1.get(i++);
}
// else add arr2[j] to big
else
{
big += arr2.get(j++);
}
}
// add remaining elements
// of arr1 to big
while (i < n1)
{
big += arr1.get(i++);
}
// add remaining elements
// of arr2 to big
while (j < n2)
{
big += arr2.get(j++);
}
return big;
}
// function to find the biggest number
static String printLargest(Vector arr, int n)
{
Vector even = new Vector(),
odd = new Vector();
for (int i = 0; i < n; i++)
{
int lastDigit = arr.get(i).
charAt(arr.get(i).length() - 1) - '0';
// inserting even numbers
if (lastDigit % 2 == 0)
{
even.add(arr.get(i));
}
// inserting odd numbers
else
{
odd.add(arr.get(i));
}
}
// merging both the array
String biggest = merge(even, odd);
// final required biggest number
return biggest;
}
// Driver code
public static void main(String[] args)
{
Vector arr = new Vector();
arr.add("78");
arr.add("81");
arr.add("88");
arr.add("79");
arr.add("117");
arr.add("56");
int n = arr.size();
System.out.println("Biggest number = " +
printLargest(arr, n));
}
}
// This code is contributed by PrinciRaj1992
C#
// C# implementation to form the biggest number
// by arranging numbers in certain order
using System;
using System.Collections.Generic;
class GFG
{
// function to merge the even and odd list
// to form the biggest number
static String merge(List arr1,
List arr2)
{
int n1 = arr1.Count;
int n2 = arr2.Count;
int i = 0, j = 0;
// to store the final biggest number
String big = "";
while (i < n1 && j < n2)
{
// if true then Add arr1[i] to big
if ((arr1[i] + arr2[j]).CompareTo((arr2[j] +
arr1[i])) > 0)
{
big += arr1[i++];
}
// else Add arr2[j] to big
else
{
big += arr2[j++];
}
}
// Add remaining elements
// of arr1 to big
while (i < n1)
{
big += arr1[i++];
}
// Add remaining elements
// of arr2 to big
while (j < n2)
{
big += arr2[j++];
}
return big;
}
// function to find the biggest number
static String printLargest(List arr, int n)
{
List even = new List(),
odd = new List();
for (int i = 0; i < n; i++)
{
int lastDigit = arr[i][arr[i].Length - 1] - '0';
// inserting even numbers
if (lastDigit % 2 == 0)
{
even.Add(arr[i]);
}
// inserting odd numbers
else
{
odd.Add(arr[i]);
}
}
// merging both the array
String biggest = merge(even, odd);
// final required biggest number
return biggest;
}
// Driver code
public static void Main()
{
List arr = new List();
arr.Add("78");
arr.Add("81");
arr.Add("88");
arr.Add("79");
arr.Add("117");
arr.Add("56");
int n = arr.Count;
Console.WriteLine("Biggest number = " +
printLargest(arr, n));
}
}
// This code is contributed by 29AjayKumar
输出:
8179788856117
时间复杂度: O(n)