题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
解题思路
先将vector容器内的元素从小到大进行排序(需要定制排序规则),然后将排好序的元素依次拼接,得到最终答案。
对于两个整数a,b的排序规则如下:
先将a,b转换为字符数字,然后按照不同的顺序拼接,用拼接字符的大小关系表示两个整数的大小关系。
- 若ab>ba,则a>b;
- 若ab<ba,则a<b;
- 若ab=ba,则a=b.
举例:3<32,但是拼接后的字符323<332,所以32<3.排序时32 在3前面。
class Solution {
public:
string PrintMinNumber(vector<int> numbers) {
string res;
int len=numbers.size();
if(len<1) return res;
sort(numbers.begin(),numbers.end(),cmp);
for(int i=0;i<len;++i){
res+=to_string(numbers[i]);
}
return res;
}
static bool cmp(int a,int b){
string x=to_string(a)+to_string(b);
string y=to_string(b)+to_string(a);
return x<y;
}
};
注意:上述代码中的比较函数必须定义成静态成员函数,否则编译器会报错。
原因是C++中函数模板sort()中的第三个参数是一个指针函数,包含两个形参,但是类的非静态函数还包含一个隐形参数(this指针),可能就是这个原因编译器才会报错吧,这也是个人揣摩,如有误请指正。
当然,如果比较函数不定义为静态函数,也可以将比较函数定义为全局函数,在类内直接调用,如下所示:
bool cmp(int a,int b)
{
string x=to_string(a)+to_string(b);
string y=to_string(b)+to_string(a);
return (x<y);
}
class Solution {
public:
string PrintMinNumber(vector<int> numbers) {
string res;
int len=numbers.size();
if(len<1) return res;
sort(numbers.begin(),numbers.end(),cmp);
for(int i=0;i<len;++i){
res+=to_string(numbers[i]);
}
return res;
}
};
网友评论