题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这3个数字能排成的最小数字321323.
思路:1、全排列后排序取出最小,复杂度太高了
2、利用String类,先将整数数组转为字符串数组,然后字符串数组进行排序,最后依次输出字符串数组即可。这里注意的是字符串的比较函数需要重新定义,不是比较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 ComArrayMin(int *pArray, int num)
{
int i;
string *pStrArray=new string[num];
for(i=0; i<num; i++)
{
stringstream stream;
stream<<pArray[i];
stream>>pStrArray[i];
}
sort(pStrArray, pStrArray+num, compare);
for(i=0; i<num; i++)
cout<<pStrArray[i];
cout<<endl;
delete[] pStrArray;
}