九章算法官网-原文网址
http://www.jiuzhang.com/problem/35/
题目
给定一个只包含正整数的数组,给出一个方法,将数组中的数拼接起来,使得拼接后的数最大。例如,[1, 32, 212]拼接之后,所得到的最大数为322121。
解答
方法一:
这道题的关键在于怎么确定每个数在最后结果中的排列位置,大家第一步想到的是肯定是第一位数越大的越靠前,如8在6, 5之前;如果第一位相同的情况出现那么再看第二位,比如下面这个例子[4,45,40]中, 45应当在40之前;难点是位数不等的情况下,先后关系怎么确定?如4应当放在40和45之前、之后还是中间?结果是4放在了45和40中间,为什么呢?这是因为十位上的4比个位上0大,所以4在40之前。通过这样的方法,虽然可以找出个先后顺序,但是还需考虑其他的情况,太复杂了。
方法二:
我们为什么不直接比较一下不同组合的结果大小?比如说:可以通过比较445和454的大小来确认4和45的先后位置,由于454比445大,所以45应当在前。所以可以通过比较两个数的方法, 来排序这个数组里面的所有的元素然后把他们拼接在一起。通过这样的方法我们不就可以找到最后的答案了么?
面试官角度
这是一道贪心算法题,一般来说,都会想到要把第一个数字大的数放前面(总位数固定,自然高位数字越大越好),那么如何将这种你可能能用几句话描述出大概意思的规则变为让程序可以实现的规则,是这个问题的考点。通常求职者都可以答出大致的规则,但是具体落实到程序上,就不尽然都能完美实现。
时间: 2024-10-14 08:23:50