题目
题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
输入输出示例
- {3,32,321} ----> 321323
- {3,333332,3334} ----> 33333233334
思路
显而易见,要重新定义两个数的大小,排好序之后按顺序将字符串拼接起来即可。
如何定义两个数的大小,不太容易立刻想到。其实很简单,为了方便,先将所有的数字转换成字符串,想要比较字符串a
和字符串b
的大小,就是比较拼接之后的字符串ab
和字符串ba
的大小。如果ab < ba
,则a<b
。定义好这个规则之后,就可以用c++
算法库中的sort
函数进行排序,最终将所有的字符串拼接起来。
代码
class Solution {
public:
// 需要是静态函数,或者全局函数
static bool comp(const string &str1,const string &str2){
string s1 = str1+str2;
string s2 = str2+str1;
return s1 < s2;
}
string PrintMinNumber(vector<int> numbers) {
int size = numbers.size();
vector<string> nums_str;
//先转为字符串
for(int i=0;i<size;i++){
string s = to_string(numbers[i]);
nums_str.push_back(s);
}
// 使用 algorithm 库中的 sort函数
sort(nums_str.begin(), nums_str.end(),comp);
string ans = "";
for(int i=0;i<size;i++){
ans += nums_str[i];
}
return ans;
}
};
注意
定义给sort
函数使用的比较函数comp
时,需要定义成静态函数或者全局函数,因为sort
函数的第三个参数是具有两个形参的函数,而类函数会隐含的传递this
指针,其实会多一个参数,导致sort
函数运行报错!
如果非要用类函数的话,也不是没有办法。可以使用c++11
的bind
函数(注意包含头文件 #include <functional>
)。
bool comp(const string &str1,const string &str2){
string s1 = str1+str2;
string s2 = str2+str1;
return s1 < s2;
}
auto func = std::bind(&comp, this, std::placeholders::1, std::placeholders::2);
sort(nums_str.begin(), nums_str.end(),func);
总结
- 使用
to_string()
函数可以将数字转为字符串(从c++11
开始支持) - 要巧妙的设计比较函数
- 善于利用
algorithm
库中的sort
函数进行排序 - 注意
sort
函数的比较函数(第三个参数)的要求 - 类函数隐含传递
this
指针
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。