把数组排成最小数c++

版权声明:欢迎去我的新家https://www.jianshu.com/u/906a78709f1d https://blog.csdn.net/dongyanwen6036/article/details/84841477

1.static bool Comp :

/*对vector容器内的数据进行排序,按照 将a和b转为string后
 若 a+b<b+a  a排在在前 的规则排序,
 如 2 21 因为 212 < 221 所以 排序后为 21 2 
  to_string() 可以将int 转化为string*/
class Solution {
public:
	static bool Comp(int a,int b)
	{
		string A="";
		string B = "";
		A += to_string(a);
		A += to_string(b);
		B += to_string(b);
		B += to_string(a);

		return A < B;
	}
	string PrintMinNumber(vector<int> numbers) {
		string min = "";
		sort(numbers.begin(), numbers.end(), Comp);
		for (int i = 0; i < numbers.size(); i++)
		{
			min += to_string(numbers[i]);
		}
		return min;
	}
};
  • sort中的比较函数compare要声明为静态成员函数或全局函数,不能作为普通成员函数,否则会报错 。 因为:非静态成员函数是依赖于具体对象的,而std::sort这类函数是全局的,因此无法再sort中调用非静态成员函数。静态成员函数或者全局函数是不依赖于具体对象的, 可以独立访问,无须创建任何对象实例就可以访问。同时静态/全局函数 不可以调用类的非静态成员。

  • sort 是将数组里所有的数都按照这个规则排序了, 排序完成以后, 数组里面数的排列就已经是最小的数了, 再用一个循环拼接成字符串就好了

2.可以用Lambda表达式替代Comp函数

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

背景:Lambda表达式可以像函数指针、仿函数一样,作为一个可调用对象(callable object)被使用,比如作为谓词传入标准库算法。
也许有人会问,有了函数指针、函数对象为何还要引入Lambda呢?函数对象能维护状态,但语法开销大,而函数指针语法开销小,却没法保存函数体内的状态。如果你觉得鱼和熊掌不可兼得,那你可错了。Lambda函数结合了两者的优点,让你写出优雅简洁的代码。

  • Lambda 表达式就是一个可调用的代码单元,我们可以将其理解为一个未命名的内联函数。与任何函数类似,一个Lambda具有一个返回类型、一个参数列表和一个函数体。但与函数不同,Lambda可以定义在函数内部,其语法格式如下:
[capture list](parameter list) mutable(可选) 异常属性->return type{function body}

capture list(捕获列表)是一个Lambda所在函数中定义的局部变量的列表,通常为空,表示Lambda不使用它所在函数中的任何局部变量。parameter list(参数列表)、return type(返回类型)、function body(函数体)与任何普通函数基本一致,但是Lambda的参数列表不能有默认参数,且必须使用尾置返回类型。 mutable表示Lambda能够修改捕获的变量,省略了mutable,则不能修改。异常属性则指定Lambda可能会抛出的异常类型。

参考

猜你喜欢

转载自blog.csdn.net/dongyanwen6036/article/details/84841477