📜  通过按一定顺序排列数字来获得最大数字

📅  最后修改于: 2021-04-29 16:52:37             🧑  作者: Mango

给定一个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)时间复杂度问题。

以下是查找最大数目保持奇数和偶数顺序的步骤。

  1. 将原始数组的数量分成2个数组even []奇数[] 。在划分数字顺序时应保持。
  2. 合并偶数奇数数组,并在合并时遵循条件。令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)