日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

把数组排列成最小的数(详解)

發(fā)布時間:2024/7/23 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 把数组排列成最小的数(详解) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題目:

??輸入一個正整數(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。