C ++程序排列给定的数字以形成最大的数字
给定一组数字,以产生最大值的方式排列它们。例如,如果给定数字是 {54, 546, 548, 60},则排列 6054854654 给出最大值。如果给定的数字是 {1, 34, 3, 98, 9, 76, 45, 4},则排列 998764543431 给出最大值。
我们想到的一个简单的解决方案是按降序对所有数字进行排序,但简单的排序是行不通的。例如,548 大于 60,但在输出中 60 在 548 之前。作为第二个示例,98 大于 9,但在输出中 9 在 98 之前。
那么我们该怎么做呢?这个想法是使用任何基于比较的排序算法。
在使用的排序算法中,不使用默认比较,而是编写一个比较函数myCompare()并使用它对数字进行排序。
给定两个数字X和Y , myCompare()应该如何决定首先放置哪个数字 - 我们比较两个数字 XY(Y 附加在 X 的末尾)和 YX(X 附加在 Y 的末尾)。如果XY较大,则 X 应该在输出中出现在 Y 之前,否则 Y 应该在之前。例如,让 X 和 Y 为 542 和 60。为了比较 X 和 Y,我们比较 54260 和 60542。由于 60542 大于 54260,我们将 Y 放在首位。
以下是上述方法的实现。
为了保持代码简单,数字被视为字符串,使用向量而不是普通数组。
下面是上述方法的实现:
C++
// Given an array of numbers,
// program to arrange the numbers
// to form the largest number
#include
#include
#include
#include
using namespace std;
// A comparison function which
// is used by sort() in
// printLargest()
int myCompare(string X, string Y)
{
// first append Y at the end of X
string XY = X.append(Y);
// then append X at the end of Y
string YX = Y.append(X);
// Now see which of the two
// formed numbers is greater
return XY.compare(YX) > 0 ? 1 : 0;
}
// The main function that prints
// the arrangement with the
// largest value. The function
// accepts a vector of strings
void printLargest(vector arr)
{
// Sort the numbers using
// library sort function. The
// function uses our comparison
// function myCompare() to
// compare two strings. See
// http://www.cplusplus.com/reference/
// algorithm/sort/
// for details
sort(arr.begin(), arr.end(), myCompare);
for (int i = 0; i < arr.size(); i++)
cout << arr[i];
}
// Driver code
int main()
{
vector arr;
// output should be 6054854654
arr.push_back("54");
arr.push_back("546");
arr.push_back("548");
arr.push_back("60");
printLargest(arr);
return 0;
}
输出:
6054854654
时间复杂度: O(nlogn) ,排序被认为具有 O(nlogn) 的运行时间复杂度,并且 for 循环在 O(n) 时间内运行。
辅助空间: O(1)。
请参阅完整的文章排列给定的数字形成最大的数字 |设置 1 了解更多详情!