problem description:
Given a list of non negative integers, arrange them such that they form the largest number.
For example, given [3, 30, 34, 5, 9]
, the largest formed number is 9534330
.
Note: The result may be very large, so you need to return a string instead of an integer.
Credits:
Special thanks to @ts for adding this problem and creating all test cases.
comments:这道题目给出的提示是:排序。希望所得的数字尽可能大,即需要大的数字对应的权重值比较高。可以先将int型转化为string类型比较,但是直接的string类型的比较是不可取的,需要额外的定义一种比较字符串的函数。
主要思路是:
1.定义vector<itn> 保存数组;
2.转化为vector<string>类型;
3.定义比较的方法,比较vector<string>类型,排序。
#include<iostream>
#include<vector>
#include<string>
#include<list>
#include<map>
#include<sstream>
#include<algorithm>
using namespace std;
string int2str(int &i) {
string s;
stringstream ss(s);
ss << i;
return ss.str();
}
bool Isbig(const string &s1, const string & s2)
{
string st1;
string st2;
st1 = s1 + s2;
st2 = s2 + s1;
if (st1 < st2)
return 1;
else
return 0;
}
class Solution
{
public:
string largestNumber(vector<int> &num)
{
vector<string> str;
string out;
vector<int>::iterator iter = num.begin();
vector<string>::iterator istr = str.begin();
// char temp[256];
string temp;
while (iter != num.end())
{
temp = int2str(*iter++);
str.push_back(temp);
}
sort(str.begin(), str.end(), Isbig);
istr = str.begin();
if (*(--str.end()) == "0")return string("0");
for (vector<string>::reverse_iterator riter = str.rbegin(); riter != str.rend(); ++riter)
out += *riter;
return out;
}
};
int main()
{
vector<int> vec = {12,128
};
// sort(vec.begin(),vec.end());
Solution a;
cout << a.largestNumber(vec) << endl;
system("pause");
return 0;
}