N個正整數連接成最大的數


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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章