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

题目链接:把数组排成最小的数

题目描述

输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
分析:首先,思路就是进行一次排列,找出最小的数。但是这样数组个数比较多时会超时。具体代码如下:

class Solution {
public:
	vector<string> vvs;
	void Perm(vector<string> vs,int len){
		if(vs.size()==len){
			string s = "";
			for(int i = 0;i<vs.size();++i)
				s+=vs[i];
			vvs.push_back(s);
		}
		else{
			for(int i = len;i<vs.size();++i){
				swap(vs[len],vs[i]);
				Perm(vs,len+1);
				swap(vs[len],vs[i]);
			}
		}
	}

    string PrintMinNumber(vector<int> numbers) {
        vector<string> vs;
        for(int i = 0;i<numbers.size();++i){
            string sss = to_string(numbers[i]);
            vs.push_back(sss);
        }
		Perm(vs,0);
		string mins = "a";
		for(int i = 0;i<vvs.size();++i)
			if(vvs[i]<mins)
				mins = vvs[i];
		return mins;
    }
};
思路2: 先将整数数组转为字符串数组,然后字符串数组进行排序,最后依次输出字符串数组即可。这里注意的是字符串的比较函数需要重新定义,不是比较a和b,而是比较ab与 ba。如果ab < ba,则a < b;如果ab > ba,则a > b;如果ab = ba,则a = b。 比较函数的定义是本解决方案的关键。这道题其实就是希望我们能找到一个排序规则,根据这个规则排出来的数组能排成一个最小的数字。实现代码如下:

class Solution {
public:
	string itos(int x){
    return (x > 9 ? itos(x / 10) : "") + char(x % 10 + '0');
	}
	bool cmp(int a, int b){
		return itos(a) + itos(b) < itos(b) + itos(a);
	}
    string PrintMinNumber(vector<int> a) {
        sort(a.begin(), a.end(), cmp);
        string s = "";
        for(int i = 0; i < int(a.size()); ++i) 
			s += itos(a[i]);
        return s;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值