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;
}


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