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.
本来觉得是一个很简单的问题,最初的想法也很简单,将各个数字转化为string,然后对各个string使用<进行比较,再将各个串相加,但是最后leetcode总是通不过,不能用strstream,不能用itoa,sprintf_s不能用(因为使用的C++编程,sprintf会有一个warning说明要将sprintf转换为sprintf_s,VS 很正常,但是leetcode就不行,折腾了半天,试试看sprintf,XX,竟然通过了)。
但是最后有2个问题:
1.输入的数字都是0的时候,因为输出是数字所以只输出“0”
2.举例:5<54,但是554>545
第一个解决很容易,第二个就走了很多弯路,试图用各种不靠谱的补丁来解决,最后醍醐灌顶可以比较两个数的字符串正反相加来得到(可以骂脏话吗?-_-#)。
string LeetCode::largestNumber(vector<int> &num)
{
vector<string> str;
vector<int>::iterator begin_num=num.begin();
vector<int>::iterator end_num=num.end();
// strstream ss;
// ostrstream oss;
string s;
int sum=0;
for (;begin_num<end_num;++begin_num)
{
int a=*begin_num;
sum+=a;
char c[10];
sprintf(c,"%d",a);
string b(c);
str.push_back(b);
}
if (sum==0)
{
return("0");
}
vector<string>::iterator string_begin=str.begin();
vector<string>::iterator string_end=str.end();
s.clear();
begin_num=num.begin();
for (;string_begin<string_end;++string_begin)
{
vector<string>::iterator temp=string_begin;
// vector<int>::iterator
temp++;
for (;temp<string_end;++temp)
{
//对两个数字字符串的正反相加进行比较,从而得出最大的数字
string st1=*temp+*string_begin;
string st2=*string_begin+*temp;
if (st1>st2)
{
string temp1=*temp;
*temp=*string_begin;
*string_begin=temp1;
}
}
s+=*string_begin;
}
return s;
}
总结:审题不细心,出现问题没有仔细分析只想着打补丁,对于最初的想法过于坚持。