考的是排序算法,使用任何一种排序算法都可以过,我使用的是快排。题目的增加一点难点,就是把比较大小的函数自定义一下,变成比较拼接后的大小。
比如 123,567 分别拼接成左边在前的123567,右边在前的567123,比较后面两个拼接的数字的大小。按这个来排序。
class Solution {
public:
    /**
     * 最大数
     * @param nums int整型vector 
     * @return string字符串
     */
    string solve(vector<int>& nums) {
        // write code here
        nums = quikSort(nums);
        if(nums[0] == 0){
            return "0";
        }
        return numsToString(nums);
    }
    
    //比较排列先后
    bool comSolve(int a,int b){
        int left = a;
        int right = b;
        if(a >= 1000){
            right = b * 10000 + a;
        }else if(a >= 100){
            right = b * 1000 + a;
        }else if(a >= 10){
            right = b * 100 + a;
        }else{
            right = b * 10 + a;
        }
        
        if(b >= 1000){
            left = a * 10000 + b;
        }else if(b >= 100){
            left = a * 1000 + b;
        }else if(b >= 10){
            left = a * 100 + b;
        }else{
            left = a * 10 + b;
        }
        
        return left >= right;
    }
    
    //排序
    vector<int> quikSort(vector<int> & nums){
        if(nums.size() <= 1){
            return nums;
        }
        vector<int> left;
        vector<int> right;
        for(int i=1;i<nums.size();i++){
            if(comSolve(nums[i],nums[0])){
                left.push_back(nums[i]);
            }else{
                right.push_back(nums[i]);
            }
        }
        left = quikSort(left);
        right = quikSort(right);
        left.push_back(nums[0]);
        left.insert(left.end(),right.begin(),right.end());
        return left;
    }
    
    //转字符串
    string numsToString(vector<int> & nums){
        string res = "";
        for(int i=0;i<nums.size();i++){
            res += to_string(nums[i]);
        }
        return res;
    }
};
简化一下比较函数,然后快排也可以优化一下

class Solution {
public:
    /**
     * 最大数
     * @param nums int整型vector 
     * @return string字符串
     */
    string solve(vector<int>& nums) {
        // write code here
        quikSort(nums,0,nums.size()-1);
        if(nums[0] == 0){
            return "0";
        }
        return numsToString(nums);
    }
    
    //比较排列先后
    bool comSolve(int a,int b){
        return to_string(a)+to_string(b) <= to_string(b)+to_string(a);
    }
    
    //排序
    void quikSort(vector<int> & nums,int left,int right){
        if(left >= right){
            return;
        }
        
        int i=left,j = right;
        int base = nums[left];
        while(i<j){
            while(comSolve(nums[j],base) && i < j) {
                j--;
            };
            while(comSolve(base,nums[i]) && i < j) {
                i++;
            };;
            
            if(i<j){
                swap(nums[i], nums[j]);
            }
        }
        
        nums[left] = nums[i];
        nums[i] = base;
        
        quikSort(nums, left, i-1);
        quikSort(nums, i+1, right);
    }
    
    //转字符串
    string numsToString(vector<int> & nums){
        string res = "";
        for(int i=0;i<nums.size();i++){
            res += to_string(nums[i]);
        }
        return res;
    }
};