牛客网
题目描述:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323
class Solution {
public:
string PrintMinNumber(vector<int> numbers) {
vector<string> nums;
for(auto r : numbers){
nums.push_back(to_string(r));
}
sort(nums.begin(),nums.end(),cmp);
string ans;
for(auto r : nums){
ans+=r;
}
return ans;
}
static bool cmp(string a,string b){
string A,B;
A = a+b;
B = b+a;
return A<B;
}
};
试着写了直接比较字符串大小的快排算法,发现对于输入{3,32,321},输出的是332321,当两字符串首位相等时,需要根据后位与首位的大小关系的不同,确定不同的比较方法,策略较为复杂。看了眼讨论,直接对sort函数进行重载。
知识点:
sort中的比较函数compare要声明为静态成员函数或全局函数,不能作为普通成员函数,否则会报错。 因为:非静态成员函数是依赖于具体对象的,而std::sort这类函数是全局的,因此无法再sort中调用非静态成员函数。静态成员函数或者全局函数是不依赖于具体对象的, 可以独立访问,无须创建任何对象实例就可以访问。同时静态成员函数不可以调用类的非静态成员。
class Solution {
public:
string PrintMinNumber(vector<int> numbers) {
vector<string> nums;
for(auto r : numbers){
nums.push_back(to_string(r));
}
sortquick(nums,0,nums.size()-1);
string ans;
for(auto r : nums){
ans+=r;
}
return ans;
}
void sortquick(vector<string>& nums,int l,int r){
if(l<r){
int left = l,right = r;
string jizhun = nums[left];
while(left<right){
while(left<right&&(nums[right]+jizhun>=jizhun+nums[right])) right--;
if(left<right){
nums[left++] = nums[right];
}
while(left<right&&(nums[left]+jizhun<jizhun+nums[left])) left++;
if(left<right){
nums[right--] = nums[left];
}
}
nums[left] = jizhun;
sortquick(nums,l,left-1);
sortquick(nums,left+1,r);
}
}
};
在这个思路下,改进了快排的判断大小方式,关键点在于nums[right]+jizhun>=jizhun+nums[right])与(nums[left]+jizhun<jizhun+nums[left])这两个判断,以此类推,今后遇到相似问题,一种处理方式是可以重载sort,或者可以直接手写以新排序标准为准则的排序算法。