179. Largest Number
题目描述:
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
.
思路:
初步想法是先对数组进行排序,使得排序后相连接的数字最大。我采用最简单的冒泡排序,这里的关键是如何比较两个数,那个应该放在前面(即那个数大)。
比较两数大小步骤:
1:分别计算整数m,n的前后组合的字符串mn和nm。如m= 123, n= 456,则mn= 123456, nm= 456123。
2:比较组合后的mn和nm,那个数大。由于mn和nm有可能太大,超出int的范围,故,我采用按位比较字符串字符大小的方法,从前往后,依次比较把每一位大小。
连接数字成为字符串:
1:两数字转换为字符串,我使用C++中的streanstream。stringstream ss;ss << nums[i];。
2:连接字符串,str += ss.str();。
附上代码:
class Solution {
public:
bool Comp(int m, int n)
{
stringstream ssm;
ssm << m;
stringstream ssn;
ssn << n;
string smn = ssm.str() + ssn.str();
string snm = ssn.str() + ssm.str();
stringstream ssmn(smn);
stringstream ssnm(snm);
int newmn, newnm;
ssmn >> newmn;
ssnm >> newnm;
int cnt = smn.length();
for(int i = 0; i < cnt; i ++)
{
if(smn[i] > snm[i])
return true;
else if(smn[i] < snm[i])
return false;
}
return true;
}
void BubbleSort(vector<int>& nums)
{
int n = nums.size();
for(int i = n - 1; i > 0; i --)
{
for(int j = 0; j < i; j ++)
{
if(!Comp(nums[j], nums[j + 1]))
{
int tmp = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = tmp;
}
}
}
}
string largestNumber(vector<int>& nums) {
BubbleSort(nums);
int n = nums.size();
string str = "";
for(int i = 0; i < n; i ++)
{
stringstream ss;
ss << nums[i];
if(str != "" || ss.str() != "0" || i == n - 1)
str += ss.str();
}
return str;
}
};