題目
題目:輸入一個正整數(shù)數(shù)組,把數(shù)組里所有數(shù)字拼接起來排成一個數(shù),打印能拼接出的所有數(shù)字中最小的一個。例如輸入數(shù)組{3,32,321},則打印出這三個數(shù)字能排成的最小數(shù)字為321323。
輸入輸出示例
- {3,32,321} ----> 321323
- {3,333332,3334} ----> 33333233334
思路
顯而易見,要重新定義兩個數(shù)的大小,排好序之后按順序?qū)⒆址唇悠饋砑纯伞?/p>
如何定義兩個數(shù)的大小,不太容易立刻想到。其實很簡單,為了方便,先將所有的數(shù)字轉(zhuǎn)換成字符串,想要比較字符串a
和字符串b
的大小,就是比較拼接之后的字符串ab
和字符串ba
的大小。如果ab < ba
,則a<b
。定義好這個規(guī)則之后,就可以用c++
算法庫中的sort
函數(shù)進行排序,最終將所有的字符串拼接起來。
代碼
class Solution {
public:
// 需要是靜態(tài)函數(shù),或者全局函數(shù)
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;
//先轉(zhuǎn)為字符串
for(int i=0;i<size;i++){
string s = to_string(numbers[i]);
nums_str.push_back(s);
}
// 使用 algorithm 庫中的 sort函數(shù)
sort(nums_str.begin(), nums_str.end(),comp);
string ans = "";
for(int i=0;i<size;i++){
ans += nums_str[i];
}
return ans;
}
};
注意
定義給sort
函數(shù)使用的比較函數(shù)comp
時,需要定義成靜態(tài)函數(shù)或者全局函數(shù),因為sort
函數(shù)的第三個參數(shù)是具有兩個形參的函數(shù),而類函數(shù)會隱含的傳遞this
指針,其實會多一個參數(shù),導(dǎo)致sort
函數(shù)運行報錯!
如果非要用類函數(shù)的話,也不是沒有辦法??梢允褂?code>c++11的bind
函數(shù)(注意包含頭文件 #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);
總結(jié)
- 使用
to_string()
函數(shù)可以將數(shù)字轉(zhuǎn)為字符串(從c++11
開始支持) - 要巧妙的設(shè)計比較函數(shù)
- 善于利用
algorithm
庫中的sort
函數(shù)進行排序 - 注意
sort
函數(shù)的比較函數(shù)(第三個參數(shù))的要求 - 類函數(shù)隱含傳遞
this
指針