题目:给出N个正整数,如 {7, 959, 95, 71, 1}, 求将这些数连接起来所组成的最大的数,即959957711。
变形:给出N个由0...9组成的字符串(开头可能为零),求将这些字符串连接起来,所组成的最大(最小)的数。
解:排序一下,然后拼接就OK了。重点在比较函数的实现上。
方法I:比较函数在比较两个数时,从高位到低位循环比较,如代码所示。
方法II:比较函数在比较两个数A和B时,比较其拼接后的结果,即比较AB和BA,证明可见《剑指offer》。
代码(含C++11特性):
#include <vector>
#include <string>
#include <algorithm>
#include <iostream>
using namespace std;
string MaxNumber(vector<string> &v){
sort(v.begin(), v.end(), [](const string &s1, const string &s2)->bool{
int len1 = s1.length(), len2 = s2.length();
int maxLen = max(len1, len2);
for(int i= 0; i <= maxLen; ++i) //都二次循环的情况下,才认为两者相等
if(s1[i%len1] != s2[i%len2])
return s1[i%len1] > s2[i%len2];
return true;
});
string res;
for(const string &si : v)
res.append(si);
return res;
}
int MaxNumber(vector<int> &v){
vector<string> vs(v.size());
for(int i = 0; i < vs.size(); ++i)
vs[i] = to_string(v[i]);
return stoi(MaxNumber(vs));
}
int main(){
int arr[] = {7, 959, 95, 71, 1};
vector<int> v(begin(arr), end(arr));
cout << MaxNumber(v) << endl;
return 0;
}