牛客 把数组排成最小的数

该博客介绍如何将正整数数组拼接成最小的数。通过将数组元素转换为字符串,然后使用自定义比较函数进行排序,确保较小的字符串在前。详细解释了排序逻辑,并提供了相关代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

思路解析:
刚开始没什么思路,只是想把越大的数转为字符串放在后面,越小的数放在前面。之后参考了一篇的博客,一下就明白了。
https://blog.youkuaiyun.com/fanzitao/article/details/7895344

1.先将数组中的数字转为字符串,再将其放入字符串数组中。
2.将数组中的字符串进行排序,目的是小的在前面,大的在后面。排序后将其字符串数组中的所有元素拼接成一个字符串。
3.由于要排序字符串数组,所以我们需要为sort函数自定义一个比较compare函数,比较两个字符串str1, str2大小的时候,先将它们拼接起来,比较str1+str2,和str2+str1哪个大,如果str1+str2大,那说明str2应该放前面,所以按这个规则,str2就应该排在s1前面。
举个例子:
str1=“2” str2=“21”。
s1=str1+str2=“221”;
s2=str2+str1=“212”;
因为s2<s1,所以str2应该放在前面。
4.sort函数的功能就是从小到大排序,但是此次数组中放置的是字符串,所以需要自定义一个比较器(compare)。

代码:

class solution
{
	static bool compare(const string& str1, const string& str2)//定义sort函数的比较器
	{
		string s1 = str1 + str2;
		string s2 = str2 + str1;
		return s1 < s2;
	}
	string PrintMinNumber(vector<int> numbers)
	{
		string res;
		if (numbers.size() < 0)
			return res;
		vector<string> s;
		for (size_t i = 0; i < numbers.size(); i++)//将数字全部转为字符串,放入字符串数组中。
		{
			s.push_back(to_string(numbers[i]));
		}

		sort(s.begin(), s.end(), compare);//对字符串数组进行排序。

		for (size_t i = 0; i < s.size(); i++)//字符串数组排序后,结合成一个字符串,为最小的数。
		{
			res.append(s[i]);
		}
		return res;
	}
};

注意: 代码中sort中的compare函数,必须要声明为静态成员函数或者全局函数,不能作为普通成员函数,否则会报错。
因为非静态成员函数依赖于具体的对象,而std::sort这类函数是全局的,因此无法在sort函数中调用非静态成员函数。静态成员函数或者全局函数不依赖于具体的对象,可以独立访问,无须创建任何对象实例就可以访问。同时静态成员函数不可以调用类的非静态成员。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值