把数组排列成最小的数(详解)
題目:
??輸入一個正整數(shù)數(shù)組,把數(shù)組里所有數(shù)字拼接起來排成一個數(shù),打印能拼接出的所有數(shù)字中最小的一個。例如輸入數(shù)組{3,32,321},則打印出這三個數(shù)字能排成的最小數(shù)字為321323。
題目解析:
??看到這道題最直接的方法是先求出這個數(shù)組中所有數(shù)字的全排列,然后將每一種去安排列拼接,然后從拼接中找出最小的數(shù),但是這樣的效率明顯較低,那么有咩有高效的方法呢?當然有,就是定義一個排序的規(guī)則。要定義一個排序的規(guī)則,就要比較兩個數(shù),假設這兩個數(shù)是m和n,我們需要確定一個規(guī)則來決定那個應該排在前面,這里不僅僅是要對數(shù)值的比較。
??根據(jù)題目的要求,兩個數(shù)字m和n能拼成數(shù)字mn和nm,如果mn>nm,我們就應該讓n在前m在后,也就是定義n小于m,反之同理。如果mn=nm,就要定義n等于m。
??接下來就要考慮怎么去拼接數(shù)字,如果是兩個int類型的直接拼接,很有可能就溢出了,所以我們要使用字符串去拼接。既然這樣,我們就應該在開始將數(shù)組中的整數(shù)轉(zhuǎn)換為字符串,這樣在拼接的時候就方便多了,并且不用考慮溢出的問題。
??一個有效的比較規(guī)則需要滿足三個條件:自反性、對稱性和傳遞性,那么我們就來證明一下:
??自反性:顯然有 aa=aa ,所以a = a;
??對稱性:如果a > b,則有ab > ba,所以ba > ab,則有b > a;
??傳遞性:如果a > b,則有ab > ba。假設a和b用十進制表示時各自有 x位和y位,于是ab = ax10y+b,ba = bx10x+a;傳遞性如下圖:
所以這個比較規(guī)則有效。
代碼解析:
class Solution { public://排序規(guī)則static bool cmp(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) {if(numbers.empty())return "";string ret = "";sort(numbers.begin(),numbers.end(),cmp);for(size_t i = 0; i < numbers.size(); ++i)ret += to_string(numbers[i]);return ret;} };總結
以上是生活随笔為你收集整理的把数组排列成最小的数(详解)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓逆向_8 --- Android 调
- 下一篇: EasyExcel快速上手~读取