例如[0,9,523,94,10,4],排列组合后最大取值个数为:9945234100。本文废话很多,可以直接跳转到编码实现部分.背景描述这是我遇到的一道笔试题。第一次见我的时候也很迷茫。当时我的第一感觉就是排序,但是没有及时把规则搞清楚,所以后面就没有回答这个问题。问题分析确定输入值问题描述很简单,也给出了测试用例,要求很明确。但我们也需要注意隐藏在问题背后的一些问题。可以确定输入的情况大致如下:数组的元素都是非负数,但也可能为0;数组的长度是不确定的,长度可能会很大。这里假设操作没有溢出;数组元素位数不确定,用例只涉及2位,需要考虑多位的情况。这里假设操作没有溢出;我在找正规面试的时候问了面试官。面试官思路:最简单的方法就是枚举出所有可能的排列组合,然后在排列组合后求最大值;然后找到组合的规则,满足一定条件的元素先排列。当然,这些只是面试官提供的一些解决方案,还需要自己去摸索,付诸实践。复试前一天晚上,又把这道题挖了出来,发现了一些思路。以题中用例[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个元素之间重复这个单一的枚举动作。注意:符号“_”为占位符,表示该位置可能还有其他元素,但不影响当前两个元素的顺序。将不再解释此符号的后续出现。总之,我认为这个问题是排序问题的变体,在比较规则上与排序问题不同。这里不是直接比较两个元素的值,而是比较两个元素的排列组合的值。实现思路经过上面的分析,问题规律已经掌握清楚了,这里整理一下实现思路。总体思路确定使用排序算法来实现;与传统排序不同的是元素之间的比较规则;排序过程使用冒泡排序来说明上述用例的排序过程。比较规则本题的排序比较规则可以描述为:假设参与比较的两个元素是A和B(初始A在B之前,排序结果从左到右从大到小),如果排列A_B小于排列_B_A_,A和B交换位置,反之亦然。编码实现比较规则/***比较规则*@paramstring$a*@paramstring$b*@returnint*/functioncmp($a,$b){if($a==$b){return0;}返回$a。$b>$b。$一个?-1:1;}冒泡排序/***冒泡排序*@paramarray$Arr待排序的数组*@returnarray*/functionbubble_sort(array$Arr){$length=count($Arr);如果($length<2){返回$Arr;}for($i=1,$change=true;$i<=$length&&$change;$i++){$change=false;对于($j=$length-1;$j>$i-1;$j--){if(cmp($Arr[$j-1],$Arr[$j])>0){$temp=$Arr[$j-1];$Arr[$j-1]=$Arr[$j];$Arr[$j]=$温度;$改变=真;}}}return$Arr;}/***求非零元素数组中所有元素排列组合后的最大值*@paramarray$Arr待排序数组*@paramstring$method排序方法*@returnmixed*/functionarray_form_max_str(array$Arr,$method='bubble'){//参数检查if(!is_array($Arr))返回假;foreach($Arras$value){如果($value<0)返回false;}//排序算法switch($method){case'quick':usort($Arr,"cmp");//快速排序中断;案例“气泡”:$Arr=bubble_sort($Arr);//冒泡排序中断;默认值:中断;}//拼接returnimplode('',$Arr);}快速排序由于PHP中的sort函数使用的是快速排序算法,所以这里直接使用/***求非零元素数组中所有元素的最大值*@paramarray$Arr待排序数组*@paramstring$method排序方式*@returnmixed*/functionarray_form_max_str(array$Arr,$method='quick'){//参数验证if(!is_array($Arr))returnfalse;foreach($Arras$value){如果($value<0)返回false;}//排序算法switch($method){case'quick'://快速排序usort($Arr,"cmp");休息;案例“气泡”:$Arr=bubble_sort($Arr);//冒泡排序中断;默认值:中断;}//Concatenatedreturnimplode('',$Arr);}测试用例快速排序方法这里只使用2组测试用例,罗列如下。测试代码$Arr=[20,913,223,91,20,3];echo'数组是[',implode(',',$Arr),']',PHP_EOL;echo'最大排列组合为:',array_form_max_str($Arr),PHP_EOL;测试结果//第一组用例数组为[0,9,523,94,10,4]最大排列组合为:9945234100//第二组用例数组为[20,913,223,91,20,3]最大的排列组合是:91913322232020写在最后,深入分析了问题的本质,也让我对排序算法有了更深的理解,更是一种巩固。同时,也正是因为我努力解决了这个问题,所以在后来的复试环节面试官再次问同样的问题时,我给出了一个满意的解决方案。相关文章?编程王者之一(2017-12-05)
