剑指offer——把数组排成最小的数

25 篇文章 0 订阅
21 篇文章 0 订阅

方法一:用标准库中的next_permutation()进行暴力法求解:

class Solution {
public:
    string PrintMinNumber(vector<int> numbers) {
        if(numbers.empty()){
            return NULL;
        }
        sort(numbers.begin(), numbers.end());
        string res;
        string temp;
        for(int i=0;i<numbers.size();i++){
            res.append(to_string(numbers[i]));
        }
        while(next_permutation(numbers.begin(), numbers.end())){
            for(int i=0;i<numbers.size();i++){
                temp.append(to_string(numbers[i]));
            }
            if(res.compare(temp)>0){
                res = temp;
            }
            temp.clear();
        }
        return res;
    }
};

方法二:特殊的排序规则;隐藏的大数问题,因此转化为字符串形式
对于两个数的相对顺序,可以通过字符串比较得出二者的相对顺序;
如mn>nm,那么结果为nm,即n应该在m的前面(再看原来m、n的相对顺序看是否需要交换);
算法思想:对于测试用例3,32,321,312
(1)比较3、32,即332>323,故32与3交换顺序; 得32,3,321,312
(2)比较3、321,即3321>3213,故3与321交换顺序,得32,321,3,312;再比较32、321,即32321>32132,故32与321交换顺序,得321,32,3,312
(3)比较3、312,即3312>3123,故3与312交换顺序,得321,32,312,3;
再比较32、312,交换,得321、312、32、3;
再比较321、312,交换,得312、321、32、3;
最后组合出整数:312321323
由于数组可能会发生溢出,故上面的比较、组合操作均为字符串形式,交换操作可以用整数;最后的返回值为字符串
代码如下:(提交显示复杂度太高)

class Solution {
public:
    string PrintMinNumber(vector<int> numbers) {
        for(int i = 0; i < numbers.size() - 1; i ++){
            for(int j = i + 1; j > 0; j --){
                if((to_string(numbers[j-1])+to_string(numbers[j]))>(to_string(numbers[j])+to_string(numbers[j-1]))){
                    swap(j,j-1,numbers);
                }
            }
        }
        string result;
        for(int i=0;i<numbers.size();i++){
            result += to_string(numbers[i]);
        }
        return result;
    }
    void swap(int a, int b, vector<int> &numbers){
        int temp = numbers[a];
        numbers[a] = numbers[b];
        numbers[b] = temp;
    }
};

int main(){
    vector<int> numbers;
    numbers.push_back(3);
    numbers.push_back(32);
    numbers.push_back(321);
    numbers.push_back(312);
    Solution sol;
    cout<<sol.PrintMinNumber(numbers);
    return 0;
}

同样的算法改成java语言,提交可以通过:

import java.util.ArrayList;

public class Solution {
    public String PrintMinNumber(int [] numbers) {
        for(int i = 0; i < numbers.length - 1; i ++){
            for(int j = i + 1; j > 0; j --){
                if((numbers[j-1]+""+numbers[j]).compareTo(numbers[j]+""+numbers[j-1])>0){
                    swap(j,j-1,numbers);
                }
            }
        }
        String result="";
        for(int i=0;i<numbers.length;i++){
            result += numbers[i];
        }
        return result;
   }
   public  void swap(int a, int b,int [] numbers){
        int temp = numbers[a];
        numbers[a] = numbers[b];
        numbers[b] = temp;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值