输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
输入: [10,2] 输出: "102" 示例 2:
输入: [3,30,34,5,9] 输出: "3033459"
提示: 0 < nums.length <= 100
说明: 输出结果可能非常大,所以你需要返回一个字符串而不是整数 拼接起来的数字可能会有前导 0,最后结果不需要去掉前导 0
求拼接起来的最小数字,本质上是一个排序问题。
设数组 nums 中任意两数字的字符串为 xx 和 yy ,则规定排序判断规则 为:
若拼接字符串 x + y > y + xx+y>y+x ,则 xx “大于” yy ;
反之,若 x + y < y + xx+y<y+x ,则 xx “小于” yy ;
xx “小于” yy 代表:排序完成后,数组中 xx 应在 yy 左边;“大于” 则反之。
根据以上规则,套用任何排序方法对 numsnums 执行排序即可。
class Solution {
int partitate(vector<string>& strs, int begin, int end) {
int left = begin;
int right = end;
while(left < right) {
while(left < right && strs[right] + strs[begin] >= strs[begin] + strs[right]) {
right--;
}
while(left < right && strs[left] + strs[begin] <= strs[begin] + strs[left]) {
left++;
}
swap(strs[left], strs[right]);
}
swap(strs[begin], strs[left]);
return left;
}
void quickSort(vector<string>& strs, int begin, int end) {
if(begin >= end) {
return;
}
int pivot = partitate(strs, begin, end);
quickSort(strs, begin, pivot - 1);
quickSort(strs, pivot + 1, end);
}
public:
string minNumber(vector<int>& nums) {
vector<string> strs(nums.size(),"");
for(int i = 0; i < nums.size(); i++) {
strs[i] = to_string(nums[i]);
}
quickSort(strs, 0, strs.size() - 1);
string res = "";
for(int i = 0; i < strs.size(); i++) {
res += strs[i];
}
return res;
}
};
使用内置函数解题
class Solution {
public:
string minNumber(vector<int>& nums) {
vector<string> strs;
string res;
for(int i = 0; i < nums.size(); i++)
strs.push_back(to_string(nums[i]));
sort(strs.begin(), strs.end(), [](string& x, string& y){ return x + y < y + x; });
for(int i = 0; i < strs.size(); i++)
res.append(strs[i]);
return res;
}
};