【排序算法运用】剑指 Offer 45. 把数组排成最小的数

本问题对应课程链接:剑指offer刷题第六期

要求:

1、请打卡你的解题代码,如果能简单说一下思路则简单说一下思路。
2、给出你代码所用的时间复杂度和空间复杂度

共以下 14 个回答

  • mpweixin用户 普通 2024年4月3日 下午2:29

    public String crackPassword(int[] password) {
    String[] strs=new String[password.length];
    for(int i=0;i<password.length;i++){
    strs[i] = String.valueOf(password[i]);
    }
    quickSort(strs,0,strs.length-1);
    StringBuilder res= new StringBuilder();
    for(String s:strs)
    res.append(s);
    return res.toString();
    }
    public void quickSort(String[] strs,int l,int r){
    if(l<r){
    int mid=getMid(strs,l,r);
    quickSort(strs,l,mid-1);
    quickSort(strs,mid+1,r);
    }
    }
    public int getMid(String[] strs,int l,int r){
    String temp=strs[l];
    while(l<r){
    while(l=0)
    r–;
    strs[l]=strs[r];
    while (l < r && (strs[l] + temp).compareTo(temp + strs[l]) <= 0)
    l++;
    //把比基准大的数移到高端
    strs[r] = strs[l];
    }
    strs[l] = temp;
    return l;
    }
    }
    思路:将数字专为string 用compartTo来比较 +快排实现

    0 赞同 0 条回复
  • 扣子 普通 2024年3月28日 下午9:41

    java
    class Solution {
    public String crackPassword(int[] nums) {
    String[] strs = new String[nums.length];

        for(int i = 0; i < nums.length; i++){
            strs[i] = String.valueOf(nums[i]);
        }
    
        for(int i = 0; i < strs.length; i++){
            for(int j = 0; j < strs.length - i - 1; j++){
                if((strs[j] + strs[j + 1]).compareTo(strs[j + 1] + strs[j]) > 0){
                    String tmp = strs[j + 1];
                    strs[j + 1] = strs[j];
                    strs[j] = tmp;
                }
            }
        }
    
        StringBuilder sb = new StringBuilder();
        for(int i = 0; i < strs.length; i++){
           sb.append(strs[i]); 
        }
        return sb.toString();
    }
    

    }
    提交

    0 赞同 0 条回复
  • 神经蛙 普通 2024年3月28日 上午12:21

    class Solution {
    public:
    string crackPassword(vector& password) {
    vector strs;
    for(int i = 0; i < password.size(); i++)
    strs.push_back(to_string(password[i]));
    quickSort(strs, 0, strs.size() – 1);
    string res;
    for(string s : strs)
    res.append(s);
    return res;
    }
    private:
    void quickSort(vector
    & strs, int l, int r) {
    if(l >= r) return;
    int i = l, j = r;
    while(i < j) {
    while(strs[j] + strs[l] >= strs[l] + strs[j] && i < j) j–;
    while(strs[i] + strs[l] <= strs[l] + strs[i] && i < j) i++;
    swap(strs[i], strs[j]);
    }
    swap(strs[i], strs[l]);
    quickSort(strs, l, i – 1);
    quickSort(strs, i + 1, r);
    }
    };
    打卡

    0 赞同 0 条回复
  • 言之命至 普通 2024年3月27日 下午9:12
    class Solution {
     public String minNumber(int[] nums) {
    
            String[] strs = new String[nums.length];
    
            for (int i = 0; i < nums.length; i++) {
                strs[i] = String.valueOf(nums[i]);
            }
    
            quickSort(strs, 0, strs.length - 1);
    
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < strs.length; i++) {
                sb.append(strs[i]);
            }
            return sb.toString();
        }
        // 快速排序模版(和普通快速排序模版一样的,除了比较这里不一样)
        private void quickSort(String[] arr, int left, int right) {
            if (left > right) {
                return;
            }
            int i = partition(arr, left, right);
            quickSort(arr, left, i - 1);
            quickSort(arr, i + 1, right);
    
        }
    
        int partition(String[] arr, int left, int right){
           String pivot = arr[left]; // 中间值
            int i = left;
            int j = right;
    
            while (i < j) {
                while (i <= j && (arr[i] + pivot).compareTo(pivot + arr[i]) <= 0) {
                    i++;
                }
    
                while (i <= j && (arr[j] + pivot).compareTo(pivot + arr[j]) >= 0) {
                    j--;
                }
                if(i >= j){
                    break;
                }
                String temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
            arr[left] = arr[j];
            arr[j] = pivot;
    
            return j;
    
        }
    }
    
    

    时间nlogn,空间 On

    0 赞同 0 条回复
  • Jimmy 普通 2024年3月26日 下午9:35

    时间复杂度:O(nlogn) 空间复杂度:O(n)

    class Solution {
    private: 
        void quickSort(vector<string>& arr,int left,int right)
        {
            if(left > right)
            {
                return;
            }
            int i = partition(arr,left,right);
            quickSort(arr,left,i-1);
            quickSort(arr,i+1,right);
    
        }
        int partition(vector<string>& arr,int left,int right)
        {
            string pivot = arr[left];
            int i=left;
            int j = right;
            while(i<j)
            {
                while(i<=j &&(arr[i]+pivot)<= (pivot+arr[i]))
                {
                    i++;
                }
                while(i<=j && (arr[j]+pivot) >= (pivot + arr[j]))
                {
                    j--;
                }
                if(i>=j)
                {
                    break;
                }
                string temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
            arr[left] = arr[j];
            arr[j] = pivot;
            return j;
        }
    
    
    public:
        string crackPassword(vector<int>& password) {
            vector<string> strs;
            for(int i=0;i<password.size();i++)
            {
                strs.push_back(to_string(password[i]));
            }
            quickSort(strs,0,strs.size()-1);
            string res;
            for(int i=0;i<strs.size();i++)
            {
                res += strs[i];
            }
            return res;
        }
    };
    
    0 赞同 0 条回复
  • 紫芝 普通 2024年3月26日 下午6:28

    思路:快排

    “`c++
    class Solution {
    public:
    string crackPassword(vector& password) {
    vector strs;
    for (int &pw: password) {
    strs.push_back(to_string(pw));
    }
    quickSort(strs, 0, strs.size()-1);
    string ans;
    for (string &s: strs) {
    cout << s << " "; ans.append(s); } return ans; } void quickSort(vector
    &pstr, int left, int right) {
    if (left >= right) return;
    int i = left, j = right;
    while (i < j) { while (i < j && pstr[j] + pstr[left] > pstr[left] + pstr[j]) –j;
    while (i < j && pstr[i] + pstr[left] <= pstr[left] + pstr[i]) ++i; swap(pstr[i], pstr[j]); } swap(pstr[i], pstr[left]); quickSort(pstr, left, i-1); quickSort(pstr, i+1, right); } }; ```

    0 赞同 0 条回复
  • heathhou 普通 2024年3月26日 下午12:41
    class Solution {
    public:
        string crackPassword(vector<int>& password) {
            vector<string> strs;
            for(int i = 0; i < password.size(); ++i){
                strs.push_back(to_string(password[i]));
            }
    
            quickSort(strs, 0, strs.size() - 1);
    
            string res;
            for(int i = 0; i < strs.size(); ++i){
                res += strs[i];
            }
            return res;
        }
    private:
        // 快速排序
        void quickSort(vector<string>& arr, int left, int right){
            if(left > right){
                return;
            }
            int i = partition(arr, left, right);
            quickSort(arr, left, i - 1);
            quickSort(arr, i + 1, right);
        }
    
        int partition(vector<string>& arr, int left, int right){
            string pivot = arr[left];
            int i = left;
            int j = right;
    
            while(i < j){
                while(i <= j && (arr[i] + pivot) <= (pivot + arr[i])){
                    i++;
                }
                while(i <= j && (arr[j] + pivot) >= (pivot + arr[j])){
                    j--;
                }
    
                if(i >= j){
                    break;
                }
    
                string temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
            arr[left] = arr[j];
            arr[j] = pivot;
            return j;
        }
    };
    

    时间复杂度:O(nlogn)
    空间复杂度:O(n)

    0 赞同 0 条回复
  • 一个达不刘 普通 2024年3月26日 上午10:24

    class Solution {
    public:
    string crackPassword(vector& password) {
    //整型转成字符串型数组
    vector strs;
    for(int i =0;i<password.size();i++){
    strs.push_back(to_string(password[i]));
    }
    //排序
    sort(strs.begin(),strs.end(),[](string& x, string& y){ return x + y < y + x; });
    //合并字符串
    string c;
    for(string s: strs){
    c.append(s);
    }
    return c;
    }
    };

    0 赞同 0 条回复
  • Yox 普通 2024年3月26日 上午2:03

    class Solution:
    def crackPassword(self, password: List[int]) -> str:
    def order(a,b):
    if a + b < b + a:
    return -1
    elif a + b > b + a:
    return 1
    else:
    return 0
    nums = [str(i) for i in password]
    nums.sort(key = functools.cmp_to_key(order))
    return “”.join(nums)
    时间 nlog n 空间 n

    0 赞同 0 条回复
  • 白雪公主倒拔垂杨柳 永久会员 2024年3月26日 上午12:23
    class Solution {
        public String crackPassword(int[] password) {
    
            String[] strs = new String[password.length];
            for(int i=0;i<password.length;i++){
                strs[i]=String.valueOf(password[i]);
            }
    
            quicksort(strs,0,strs.length-1);
    
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < strs.length; i++) {
                sb.append(strs[i]);
            }
            return sb.toString();
    
    
        }
    
        private void quicksort(String[] str,int left,int right){
            if(left>right){
                return;
            }
    
            int i = partition(str,left,right);
            quicksort(str,left,i-1);
            quicksort(str,i+1,right);
        }
    
        int partition(String[] str, int left,int right){
            String privot = str[left];
            int i=left;
            int j=right;
            while(i<j){
                // while(i<j && (str[i]+privot).compareTo(privot+str[i])<=0) i++;
                // while(i<j && (str[j]+privot).compareTo(privot+str[j])>=0) j--;
                while(i<=j && (str[i]+privot).compareTo(privot+str[i])<=0) i++;
                while(i<=j && (str[j]+privot).compareTo(privot+str[j])>=0) j--;
    
                if(i >= j) break;
    
                String temp = str[i];
                str[i] = str[j];
                str[j] = temp;
            }
    
            str[left]=str[j];
            str[j]=privot;
    
            return j;
        }
    
    }
    

    时间复杂度:O(nlogn)
    额外空间复杂度:O(n)

    0 赞同 0 条回复
  • Raphtalia. 普通 2024年3月26日 上午12:06

    class Solution {
    public:
    string crackPassword(vector& password) {
    vector strs;
    for(int i = 0; i < password.size(); i++)
    strs.push_back(to_string(password[i]));
    quickSort(strs, 0, strs.size() – 1);
    string res;
    for(string s : strs)
    res.append(s);
    return res;
    }
    private:
    void quickSort(vector
    & strs, int l, int r) {
    if(l >= r) return;
    int i = l, j = r;
    while(i < j) {
    while(strs[j] + strs[l] >= strs[l] + strs[j] && i < j) j–;
    while(strs[i] + strs[l] <= strs[l] + strs[i] && i < j) i++;
    swap(strs[i], strs[j]);
    }
    swap(strs[i], strs[l]);
    quickSort(strs, l, i – 1);
    quickSort(strs, i + 1, r);
    }
    };

    时间复杂度O(nlogn)空间复杂度O(logn)

    0 赞同 0 条回复
  • 云无深雁影 普通 2024年3月25日 下午11:42

    class Solution {
    public String crackPassword(int[] password) {
    StringBuffer ans = new StringBuffer(“”);
    String[] s = new String[password.length];
    for(int i = 0; i < password.length; i++){
    s[i] = “” + password[i];
    }
    quickSort(s,0,s.length-1);
    for(int i = 0; i < s.length; i++)
    ans.append(s[i]);
    return ans.toString();
    }
    private void quickSort(String[] password,int l,int r){
    if(l >= r)
    return;
    int i = l;
    int j = r;
    String key = password[i];
    while(i < j){
    while((password[j] + key).compareTo(key + password[j]) >= 0 && i < j){
    j–;
    }
    password[i] = password[j];
    while((password[i] + key).compareTo(key + password[i]) <= 0 && i < j){
    i++;
    }
    password[j] = password[i];
    }
    password[i] = key;
    quickSort(password,l,i-1);
    quickSort(password,j+1,r);
    }
    }
    //使用快排对string数组排序
    时间复杂度Onlogn
    空间复杂度On

    0 赞同 0 条回复
  • 王位詮釋 普通 2024年3月25日 下午9:17
    帅地的解法:
    class Solution {
        public String crackPassword(int[] password) {
            String[] strs = new String[password.length];
            for(int i = 0;i<password.length;i++){
                strs[i] = String.valueOf(password[i]);
            }
            quickSort(strs,0,strs.length-1);
            StringBuilder stringBuilder = new StringBuilder();
            for(int i = 0;i<strs.length;i++){
                stringBuilder.append(strs[i]);
            }
            return stringBuilder.toString();
        }
        public void quickSort(String[] arr,int left,int right){
            if(left>right){
                return;
            }
            int i = partition(arr,left,right);
            quickSort(arr,left,i-1);
            quickSort(arr,i+1,right);
        }
        public int partition(String[] arr,int left,int right){
            String pivot = arr[left];
            int i = left;
            int j = right;
            while(i<j){
                while(i<j&&(arr[i]+pivot).compareTo(pivot+arr[i])<=0){
                    i++;
                }
                while(i<=j&&(arr[j]+pivot).compareTo(pivot+arr[j])>=0){
                    j--;
                }
                if(i>=j){
                    break;
                }
                String temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
            arr[left] = arr[j];
            arr[j] = pivot;
            return j;
        }
    }
    
    0 赞同 0 条回复
  • Thaddeus 永久会员 2024年3月25日 下午7:57

    打卡

    class Solution {
    public:
        string crackPassword(vector<int>& password) {
            vector<string> str;
            for(auto& x : password) {
                str.emplace_back(to_string(x));
            }
            sort(str.begin(), str.end(), [](string x, string y){ return x + y < y + x; });
            string res = "";
            for(auto& s : str) res.append(s);
            return res;
        }
    };
    
    0 赞同 0 条回复

# 回答此问题

后才能回答