题意
输入一个 非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
解题思路
此题求拼接起来的最小数字,本质上是一个排序问题。设数组 nums 中任意两数字的字符串为 x 和 y ,则规定 排序判断规则 为:
- 若拼接字符串 x + y > y + x ,则 x “大于” y ;
- 反之,若 x + y < y + x,则 x “小于” y ;
x “小于” y 代表:排序完成后,数组中 x 应在 y 左边;“大于” 则反之。
根据以上规则,套用任何排序方法对 nums 执行排序即可。
算法流程:
- 初始化: 字符串列表 strs,保存各数字的字符串格式;
- 列表排序: 应用以上 “排序判断规则” ,对 strs 执行排序;
- 返回值: 拼接 strs 中的所有字符串,并返回
C++实现
class Solution
{
public:
string minNumber(vector<int>& nums)
{
//1、初始化字符串列表strs,保存各数字的字符串格式
vector<string> strs;
for(auto& num:nums)
{
strs.push_back(to_string(num));
}
//2、列表排序,应用排序规则,对strs进行排序
quick_sort(strs,0,strs.size()-1);
//3、拼接strs中的所有字符串,并且返回
string res;
for(auto& str:strs)
{
res.append(str);
}
return res;
}
void quick_sort(vector<string>& strs,int l,int r)
{
//递归出口
if(l>=r)
return;
int i=l,j=r;
while(i<j)
{
while(i<j&&strs[j]+strs[l]>=strs[l]+strs[j])
--j;
while(i<j&&strs[i]+strs[l]<=strs[l]+strs[i])
++i;
swap(strs[i],strs[j]);
}
swap(strs[i],strs[l]);
quick_sort(strs,l,i-1);
quick_sort(strs,i+1,r);
}
};