📌  相关文章
📜  给定数组中 K 个数的串联的最大可能数

📅  最后修改于: 2022-05-13 01:56:05.877000             🧑  作者: Mango

给定数组中 K 个数的串联的最大可能数

给定一个由N个整数组成的数组arr[]和一个正整数K ,任务是从数组arr[]中选择K个整数,使得它们的串联形成最大可能的整数。所有数组元素必须至少选择一次以创建数字。

注意:始终保证N大于或等于K

例子:

方法:上述问题可以通过将数字排序转换为字符串来解决。最佳方法是一次取所有数字。之后,取数字最多的数字。在平局的情况下,取字典序上最大的数字。使用 to_string()函数转换字符串中的所有数字。请按照以下步骤解决问题:

  • 初始化一个空字符串res来存储答案。
  • 按升序对数组numbers[]进行排序。
  • 初始化字符串向量v[]
  • 使用变量i遍历范围[0, K)并将字符串数字numbers[i]推入向量v[]
  • N的值减少K并将值numbers[K-1] N次推入向量v[]
  • 使用比较器函数对向量v[]进行排序。
  • 使用变量i迭代范围[v.size()-1, 0]并将值v[i]添加到变量res
  • 执行上述步骤后,打印res的值作为答案。

下面是上述方法的实现:

C++
// C++ program for the above approach
 
#include 
using namespace std;
 
// Custom comparator function
bool str_cmp(string s1, string s2)
{
    return (s1 + s2 < s2 + s1);
}
 
// Function to get the largest possible
// string
string largestNumber(vector arr,
                     int K)
{
    int N = arr.size();
 
    // Initialize a new variable which
    // will store the answers.
    string res = "";
 
    // Sort the numbers array in
    // non-decreasing order
    sort(arr.begin(), arr.end());
 
    // Stores the array element which will
    // be used to construct the answer
    vector v;
 
    // Take all numbers atleast once
    for (int i = 0; i < N; i++) {
        v.push_back(to_string(arr[i]));
    }
    K -= N;
 
    // Take the largest digits number
    // for remaining required numbers
    while (K) {
        v.push_back(to_string(arr[N - 1]));
        K--;
    }
 
    // Sort the final answer according to
    // the comparator function.
    sort(v.begin(), v.end(), str_cmp);
    for (int i = v.size() - 1; i >= 0; i--)
        res += v[i];
 
    return res;
}
 
// Driver Code
int main()
{
    vector arr = { 1, 10, 100 };
    int K = 4;
    cout << largestNumber(arr, K);
 
    return 0;
}


C#
// C# program for the above approach
using System;
using System.Collections.Generic;
 
public class GFG
{
 
  // Custom comparator function
 
  // Function to get the largest possible
  // String
  static String largestNumber(int[] arr, int K)
  {
    int N = arr.Length;
 
    // Initialize a new variable which
    // will store the answers.
    String res = "";
 
    // Sort the numbers array in
    // non-decreasing order
    Array.Sort(arr);
 
    // Stores the array element which will
    // be used to conthe answer
    List v = new List();
 
    // Take all numbers atleast once
    for (int i = 0; i < N; i++) {
      v.Add(String.Join("",arr[i]));
    }
    K -= N;
 
    // Take the largest digits number
    // for remaining required numbers
    while (K > 0) {
      v.Add(String.Join("",arr[N - 1]));
      K--;
    }
 
    // Sort the readonly answer according to
    // the comparator function.
    v.Sort((s1,s2) => (s1 + s2).CompareTo(s2 + s1));
    for (int i = v.Count - 1; i >= 0; i--)
      res += v[i];
 
    return res;
  }
 
  // Driver Code
  public static void Main(String[] args) {
    int[] arr = { 1, 10, 100 };
    int K = 4;
    Console.Write(largestNumber(arr, K));
 
  }
}
 
// This code is contributed by Rajput-Ji


Javascript



输出:
110100100

时间复杂度: O(N*log N)
辅助空间: O(N)