剑指offer-把数组排成最小的数(数组)

题目描述

输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。

这道题就是一步步拼接,先把两个数拼接,得到较小的那个

时间复杂度是O(nlogn)

class Solution {
public:
    string PrintMinNumber(vector<int> numbers) {
        string s;
        if(numbers.size()<=0)
            return s;
        sort(numbers.begin(),numbers.end());
        s=to_string(numbers[0]);
        string s1,s2;
        for(int i=1;i<numbers.size();i++)
        {
            s1=s+to_string(numbers[i]);
            s2=to_string(numbers[i])+s;
            if(s1<s2)
                s=s1;
            else
                s=s2;
        }
        return s;
    }
};

有一个在讨论区看到的方法,是对sort函数的很好的应用,关于sort函数的参数的应用。

这里补充一下sort函数的用法:

I)Sort函数包含在头文件为#include<algorithm>的c++标准库中,调用标准库里的排序方法可以不必知道其内部是如何实现的,只要出现我们想要的结果即可!

II)Sort函数有三个参数:

(1)第一个是要排序的数组的起始地址。

(2)第二个是结束的地址(最后一位要排序的地址)

(3)第三个参数是排序的方法,可以是从大到小也可是从小到大,还可以不写第三个参数,此时默认的排序方法是从小到大排序。

Sort函数使用模板:

Sort(start,end,排序方法)

要想自己定义排序方法,就可以定义一个

bool compare(int a,int b){ 排序方法的定义 }

class Solution{
public:
	static bool compare(const int &a,const int &b){
		string s1=to_string(a)+to_string(b);
		string s2=to_string(b)+to_string(a);
		return s1<s2;
	}
	string PrintMinNumber(vector<int> numbers){
		string s="";
		if(numbers.size()<0)
			return s;
		sort(numbers.begin(),numbers.end(),compare); //这里就不用给compare函数传参数了
		for(int i=0;i<numbers.size();i++)
			s+=to_string(numbers[i]);
		return s;
	}
}; 

猜你喜欢

转载自blog.csdn.net/Mr_xuexi/article/details/84639409