題目:給出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;
}