Problem:
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.
Analysis:
Solution:
C++:
string itos(int num)
{
if(num == 0)
return string("0");
string rStr;
while(num != 0) {
int digit = num%10;
char digit_char('0' + digit);
rStr.insert(0, 1, digit_char);
num = (num - digit)/10;
}
return rStr;
}
bool NeedSwap(string lhs, string rhs)
{
string lTor(lhs);
lTor.append(rhs);
string rTol(rhs);
rTol.append(lhs);
for(int i = 0; i < lTor.size(); ++i)
if(lTor[i] < rTol[i])
return true;
else if(lTor[i] > rTol[i])
return false;
}
string GetStringNum(vector<int>& num)
{
string rStr;
for(int i = 0; i < num.size(); ++i)
rStr.append(itos(num[i]));
return rStr;
}
string largestNumber(vector<int> &num)
{
if(num.size() == 0)
return "";
bool allElemIdentical = true;
int check = num[0];
for(int i = 1; i < num.size(); ++i)
if(num[i] != check)
allElemIdentical = false;
if(allElemIdentical)
if(check == 0)
return itos(check);
else
return GetStringNum(num);
vector<string> stringNumVec;
for(int i = 0; i < num.size(); ++i)
stringNumVec.push_back(itos(num[i]));
for(int outer = 1; outer < stringNumVec.size(); ++outer) {
string curNum = stringNumVec[outer];
for(int inner = outer - 1; inner >= 0; --inner)
if(NeedSwap(stringNumVec[inner], curNum)) {
stringNumVec[inner + 1] = stringNumVec[inner];
if(inner == 0)
stringNumVec[inner] = curNum;
} else {
stringNumVec[inner + 1] = curNum;
break;
}
}
string rString;
for(int i = 0; i < stringNumVec.size(); ++i)
rString.append(stringNumVec[i]);
return rString;
}
Java:
Python: