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.
这道题中等难度,但是花了我好长时间想都没想出来,没办法只得看看别人的提示,做法是把每个int都转为string存放在vector,然后字典序从大到小排,排序算法得自己改写,先是选的堆排,毕竟o(nlogn),后来操作不太方便,直接用冒泡了,需要注意的是,比较的时候应该先判断两个字符串是否为其中一个的前缀,这个很重要,比如,3,30,这时3+30>30+3,需要交换的,一点点技巧吧。最后把vector元素连接起来即可,“00000”的情况需要置为"0"。
一般我都贴完整可运行代码:
#include<iostream>
#include<vector>
#include<string>
#include<sstream>
#include<algorithm>
using namespace std;
string largestNumber(vector<int>& nums) {
int size=nums.size();
int i,j,flag;
string result;
vector<string> strV;
for ( i = 0; i <size; i++) {
stringstream ss;
ss<<nums[i];
strV.push_back(ss.str());
}
for (i = size-1; i >0; i--)
{
flag=0;
for(j=0;j<i;j++){
if(strV[j].compare(0,strV[j+1].length(),strV[j+1])==0||strV[j+1].compare(0,strV[j].length(),strV[j])==0){
if(strV[j]+strV[j+1]<strV[j+1]+strV[j])
swap(strV[j],strV[j+1]);
flag=1;
}
else if(strV[j]<strV[j+1]){
swap(strV[j],strV[j+1]);
flag=1;
}
}
if(!flag)
break;
}
for (i = 0; i <size; i++){
if(strV[0]=="0"){
result="0";
break;
}
result+=strV[i];
}
return result;
}
int main()
{
int arr[]={80,33,87,27,8};
size_t count=sizeof(arr)/sizeof(int);
vector<int> intV(arr,arr+count);
largestNumber(intV);
return 0;
}