求非負元素陣列所有元素能組合的最大字串

2021-09-13 02:12:51 字數 2968 閱讀 9200

首發於

樊浩柏科學院

問題敘述:將乙個非負元素陣列中的所有元素排列組合在一起,找出值最大的那個排列情況。例如 [0, 9, 523, 94, 10, 4],排列組合後值最大數為:9945234100。

本文廢話較多,可以直接跳轉到 編碼實現 部分。

這是我遇到的一道筆試題。首次遇見我也是很懵,當時我的第一感覺就是排序,但是沒有及時理清裡面的規律,導致後面並沒有解答出此題。

該問題描述很簡單,也給出了測試用例,需求很明白。但是還需要注意問題背後隱藏的一些問題。

可確定輸入的情況大致為:

面試時請教了一下面試官,面試官的思路:

最簡單辦法就是列舉所有可能的排列組合情況,然後求排列組合後的最大值;再就是尋找組合的規律,滿足什麼條件的元素排列在前。
當然這只是面試官提供的一些解決思路,付諸於實踐還需要探索。在複試前的一天晚上我再次翻出這個問題,並找到了一些思路。

就拿問題中的用例 [0, 9, 523, 94, 10, 4] 來說,需要找出的結果為:9,94,523,4,10,0(為了方便說明,用」,「分割了陣列元素)。

先將複雜問題簡單化處理,首先嘗試使用排序演算法來分析過程。分析 9 和 94 的排列,為什麼 9 排列在 94 前?[那是因為這 2 個數存在 2 種排列情況,既_ 9_94_ 和_ 9_49_,很明顯 9_94 排列大於 9_49 排列,所以需要將 9 排列在 94 前,反之則需要交換元素位置]()。如果採用這樣規則處理,是在 2 個元素之間進行列舉排列情況,且單次列舉情況限定在了 2 種,降低了問題的複雜程度並易於編碼實現,後續可以直接使用排序方法來多次重複這種 2 個元素之間的單次列舉動作。

說明:符號「_」為佔位符,表示該位置可能還存在其他元素,但不影響當前兩個元素的前後排列順序。後續出現該符號將不再說明。

總之,我認為該問題是排序問題的乙個變種情況,同排序問題不同的是比較規則。這裡不是直接比較 2 個元素值大小,而是比較 2 個元素排列組合後值的大小。

經過上述分析,問題規律已經掌握清楚,這裡整理出實現的思路。

使用氣泡排序來說明上述用例的排序過程。

本問題的排序比較規則可以描述為:假設參與比較的兩個元素為 a、b(初始時 a 在 b 前,排序結果從左至右為由大到小),比較時如果排列 a_b 小於排列 _b_a_,a 和 b 則交換位置,反之不交換。

/**

* 比較規則

* @param string $a

* @param string $b

* @return int

*/function cmp($a, $b)

return $a . $b > $b . $a ? -1 : 1;

}

/**

* 氣泡排序

* @param array $arr 待排序陣列

* @return array

*/function bubble_sort(array $arr)

for ($i = 1, $change = true; $i <= $length && $change; $i++) }}

return $arr;

}/**

* 尋找非零元素陣列中所有元素排列組合後的最大值

* @param array $arr 待排序陣列

* @param string $method 排序方法

* @return mixed

*/function array_form_max_str(array $arr, $method = 'bubble')

//排序演算法

switch ($method)

//拼接

return implode('', $arr);

}

由於 php 中 sort 排序函式採用快速排序演算法,這裡直接使用之。

/**

* 尋找非零元素陣列中所有元素排列組合後的最大值

* @param array $arr 待排序陣列

* @param string $method 排序方法

* @return mixed

*/function array_form_max_str(array $arr, $method = 'quick')

//排序演算法

switch ($method)

//拼接

return implode('', $arr);

}

這裡只對快速排序方法使用 2 組測試用例並列舉如下。

$arr = [20,913,223,91,20,3];

echo '陣列為[', implode(',', $arr), ']', php_eol;

echo '最大排列組合為:', array_form_max_str($arr), php_eol;

//第1組用例

陣列為[0,9,523,94,10,4]

最大排列組合為:9945234100

//第2組用例

陣列為[20,913,223,91,20,3]

最大排列組合為:9191332232020

經過深入分析問題的本質,也使得我對與排序演算法有了更深入的認識,更算是乙個鞏固。同時,正是由於我嘗試著去解決這個問題,才使得我在後面的複試環節中面試官再次提出相同問題時,給出了乙個滿意的解決方案。

求集合元素的所有非空子集

現有乙個包含n個元素的集合s,求集合s的所有子集?例如 集合s包含三個元素,則它的所有子集為 空集 和。這 裡先用位操作的思路來求解,具體方法 用2進製bit位來標記集合中的某個元素是否被選中,1代表選中,0代表未選中。例如集合的所有子集可如下表示 0 0 1 0 1 0 1 0 0 0 1 1 1...

求從n個陣列任意選取乙個元素的所有組合

最近做專案碰到這個問題,如題從n個陣列任意選取乙個元素的所有組合。比如已知陣列是 1,3 2,4 5 最後組合結果是 1,2,5 1,4,5 3,2,5 3,4,5 網上看了好多帖子,發現寫的太複雜,於是自己動手解決。直接貼解決方案 方法一 執行組合排列的函式 function doexchange...

求兩個整型陣列的非共有元素

題目描述 給定兩個整型陣列,要求找出不是兩者共有的元素。輸入 有兩行。第1行先給出正整數n n 20 隨後是n個整數,其間以空格分隔。第2行先給出正整數m m 20 隨後是m個整數,其間以空格分隔。輸出 僅一行。按照數字給出的順序輸出不是兩陣列共有的元素,數字間以空格分隔。題目保證至少存在乙個這樣的...