題目描述:輸入一個正整數數組,把數組裏所有數字拼接起來排成一個數,打印能拼接出的所有數字中最小的一個。例如輸入數組{3,32,321},則打印出這三個數字能排成的最小數字爲321323。
題解:可以用全排列的做法找到最小的數,但是這樣就會使得最後得結果要在n!個數中進行比較,這樣比較的次數和最後的結果個數太多,所有我們可以用下面的辦法,只需要在sort()函數中自定義一個Compare,讓按照Compare的規則將比較後的數進行排列,得到的就是最小值。
全排列代碼鏈接: https://blog.csdn.net/ADream__/article/details/105145908
class Solution {
public:
static bool Compare(int a,int b){
string strNum1=to_string(a);//數字轉字符串
string strNum2=to_string(b);
return (strNum1+strNum2)<(strNum2+strNum1);
}
string PrintMinNumber(vector<int> numbers) {
string str;
if(numbers.empty())
return str;
sort(numbers.begin(),numbers.end(),Compare);//排序規則
for(int i = 0; i < numbers.size();i++)
str += to_string(numbers[i]);
return str;
}
};
關於sort的第三個參數的定義: 強烈推薦看技術文檔
可以看到Compare的定義:Compare函數返回一個bool類型的值,這個值表示了在嚴格弱排序中(可以理解爲升序排序)第一參數是否位於第二個參數之前。
也就是說如果comp返回true,則第一個參數小於第二個參數,sort根據compare的返回值將第一個參數排在第二個參數之前。
如果comp返回false,則第一個參數大於第二個參數,sort根據compare的返回值將第一個參數排在第二個參數之後。
傳入A,B,定義bool myfunction (int i,int j) { return (i<j); },作爲comp函數,則排列AB。
傳入BA,則排列AB。
可以看出是升序排列的。(sort函數默認的comp函數也是默認升序的)
而如果我們定義bool myfunction (int i,int j) { return (i>j); },作爲comp函數,
傳入AB,返回false,則排列爲BA,
傳入BA,返回true,排列爲BA。
是降序排列的。