题目:
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
方法一:
思路:将每个数字变成string类型的数,类似于冒泡排序,逐渐交换,使和最小
to_string这个函数可以把int 、long 、double、float 等类型变成string类型
class Solution {
public:
string PrintMinNumber(vector<int> numbers)
{
int len=numbers.size();
string result;
for(int i=0;i<len;i++)
{
for(int j=len-1;j>i;j--)
{//比较相邻的数相加大小,交换使和最小
if(to_string(numbers[j])+to_string(numbers[j-1])<
to_string(numbers[j-1])+to_string(numbers[j]))
swap(numbers[j],numbers[j-1]);
}
}
for(int i=0;i<len;i++)
result=result+to_string(numbers[i]); //to_string将int变成string
return result;
}
};
方法二:
对vector容器内的数据进行排序,按照 将a和b转为string后
若 a+b < b+a,则排序为a b,
如 2 21 因为 212 < 221 所以 排序后为 21 2
to_string() 可以将int 转化为string
class Solution {
public:
string PrintMinNumber(vector<int> numbers)
{
int len=numbers.size();
if(len==0)
return "";
string result;
sort(numbers.begin(),numbers.end(),compare);
for(auto n:numbers)
result=result+to_string(n); //to_string将int变成string
return result;
}
static bool compare(int a,int b) //sort中排序规则函数必须为static
{
string s1=to_string(a)+to_string(b);
string s2=to_string(b)+to_string(a);
return s1<s2;
}
};