最大数
描述
给出一组非负整数,重新排列他们的顺序把他们组成一个最大的整数。
注意事项
最后的结果可能很大,所以我们返回一个字符串来代替这个整数。
样例
给出 [1, 20, 23, 4, 8],返回组合最大的整数应为8423201。
挑战
在 O(nlogn) 的时间复杂度内完成。
堆排序跟优先队列都能达到O(nlogn)
坑1:输入{0,0}要输出0
坑2:前几位相同但不同长度的数字不一定长的就排在前面,如{1,10}和{8,89},短的数字要用数字本身填充后几位
一开始写的用最后一位重复填充结果ac了,但实际上{121,121120}这样的数据用最后一位填充是错的,会输出{121120121}。
如果每位都一样返回true和false就都无所谓了。
class Solution {
public:
/*
* @param nums: A list of non negative integers
* @return: A string
*/
class cmp {
public:
bool operator() (const int& a, const int& b) {
string n1 = to_string(a), n2 = to_string(b);
for (int i = 0; i < 20; i++) {
int b1, b2;
/*
if (i == n1.length()) {
b1 = n1.back() - 48;
} else {
b1 = n1[i] - 48;
}
if (i == n2.length()) {
b2 = n2.back() - 48;
} else {
b2 = n2[i] - 48;
}
if (b1 > b2) return false;
if (b1 < b2) return true;
*/
int b1, b2;
if (n1.length() == 0) return false;
b1 = n1[i%n1.length()] - 48;
b2 = n2[i%n2.length()] - 48;
if (b1 > b2) return false;
if (b1 < b2) return true;
}
}
};
string largestNumber(vector<int> &nums) {
// write your code here
std::priority_queue<int, vector<int>, cmp> p;
string result;
for (int& i : nums) {
p.emplace(i);
}
bool zero = true;
while (!p.empty()) {
if (zero && p.top() == 0) {
p.pop();
continue;
} else {
zero = false;
}
for (auto i : to_string(p.top())) {
result.push_back(i);
}
p.pop();
}
if (zero) result.push_back('0');
return result;
}
};