面试题45. 把数组排成最小的数
输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
示例 1:
输入: [10,2]
输出: “102”
复习快排
class Solution {
public:
string minNumber(vector<int>& nums) {
string ans = "";
vector<string> str;
for(int num : nums){
str.push_back(to_string(num));
}
quickSort(str, 0, str.size() - 1);
for(auto s : str){
ans += s;
}
return ans;
}
void quickSort(vector<string>& str, int l, int r){
if(l > r) return;
int i = l, j = r;
while(i < j){
//注意这里的写法,对比原版
//while(i < j && str[j] >= str[l]) j--;
//while(i < j && str[i] <= str[l]) i++;
while(i < j && str[j] + str[l] >= str[l] + str[j]) j--;
while(i < j && str[i] + str[l]<= str[l] + str[i]) i++;
swap(str[i], str[j]);
}
swap(str[i], str[l]);
quickSort(str, l, i - 1);
quickSort(str, i + 1, r);
}
};
自定义排序
class Solution {
public:
string minNumber(vector<int>& nums) {
string ans = "";
vector<string> str;
for(int num : nums){
str.push_back(to_string(num));
}
sort(str.begin(), str.end(), [](string &x, string &y){
return x + y < y + x;
});
for(auto s : str){
ans += s;
}
return ans;
}
};