题目描述:
输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个。例如输入数组{32, 321},则输出这两个能排成的最小数字32132。请给出解决问题的算法,并证明该算法。
分析:先将整数数组转为字符串数组,然后字符串数组进行排序,最后依次输出字符串数组即可。这里注意的是字符串的比较函数需要重新定义,不是比较a和b,而是比较ab与 ba。如果ab < ba,则a < b;如果ab > ba,则a > b;如果ab = ba,则a = b。比较函数的定义是本解决方案的关键
#include <iostream>
#include <string>
#include <sstream>
#include <algorithm>
using namespace std;
bool compare(const string& str1, const string& str2)
{
string s1 = str1 + str2;
string s2 = str2 + str1;
return s1 < s2;
}
void ArrayToMinNumber(int arr[], int n)
{
string *pStrArr = new string[n];
for (int i = 0; i < n; i++)
{
stringstream stream;
stream << arr[i];
stream >> pStrArr[i];
}
sort(pStrArr, pStrArr + n, compare);
for (int j = 0; j < n; j++)
{
cout << pStrArr[j];
}
cout << endl;
delete [] pStrArr;
}
int main()
{
int arr[] = {12, 34, 456, 564, 231};
int n = sizeof(arr) / sizeof(*arr);
ArrayToMinNumber(arr, n);
return 0;
}
比较函数的定义或者可以这么写:
- struct compare
- {
- bool operator() (const string &src1, const string &src2)
- {
- string s1 = src1 + src2;
- string s2 = src2 + src1;
- return s1 < s2; //升序排列,如果改为s1 > s2则为逆序排列
- }
- };
sort(pStrArray, pStrArray + num, compare());
reference:
http://blog.csdn.net/wuzhekai1985/article/details/6704902