184. 最大数
给出一组非负整数,重新排列他们的顺序把他们组成一个最大的整数。
样例
Example 1:
Input:[1, 20, 23, 4, 8]
Output:"8423201"
Example 2:
Input:[4, 6, 65]
Output:"6654"
挑战
在 O(nlogn) 的时间复杂度内完成。
注意事项
最后的结果可能很大,所以我们返回一个字符串来代替这个整数。
bool compare(const string &str1, const string &str2)
{
int size1 = str1.size();
int size2 = str2.size();
if (size1 == size2)
{
return str1 > str2;
}
if (size1 > size2)
{
string tmp = str2;
int num = size1 - size2;
while (num)
{
tmp.append(std::string(1,str2[size2 - 1]));
num--;
}
return str1 >= tmp;
}
else
{
string tmp = str1;
int num = size2 - size1;
while (num)
{
tmp.append( std::string(1,str1[size1 - 1]) );
num--;
}
return tmp >= str2;
}
}
void quickSort(vector<string> &tmpVec, int start, int end)
{
if (start >= end)
{
return;
}
int left = start;
int right = end;
string tmpStr1 = tmpVec[right];
while (left < right)
{
//从左向右找小数
while (left < right && ( compare(tmpVec[left], tmpStr1) || tmpVec[left] == tmpStr1) )
{
left++;
}
if (left < right && compare(tmpStr1,tmpVec[left]))
{
tmpVec[right] = tmpVec[left];
right--;
}
//从右向左找大数
while (left < right && (compare(tmpStr1, tmpVec[right]) || tmpVec[right] == tmpStr1))
{
right--;
}
if (left < right && compare( tmpVec[right], tmpStr1))
{
tmpVec[left] = tmpVec[right];
left++;
}
}
tmpVec[left] = tmpStr1;
quickSort(tmpVec, start, left-1);
quickSort(tmpVec,left+1,end);
}
string largestNumber(vector<int> &nums) {
// write your code here
vector<string> tmpVec;
for (auto it : nums)
{
tmpVec.push_back(std::to_string(it));
}
quickSort(tmpVec, 0, tmpVec.size()-1);
string ret;
for (auto it : tmpVec)
{
ret.append(it);
}
if(ret[0] == '0')
{
return "0";
}
return ret;
}