面试题 33,把数组排成最小数(非常巧妙的重定义了比较函数,再基于这个比较函数排序)

我的思路:

递归函数,函数将数组作为输入,函数中的逻辑是这样的:

返回条件是数组中只有一个数了,就返回这个数。

从最高为开始比较数组里的成员,返回最高位最小的,如果最高位一致,比较第二位,如果存在没有第二位的数,看是否其他数中有第二位比第一位小的,有的话,返回第二位最小的数,没有,返回那个没有第二位的数;如果所有数都有第二位,返回第二位最小的数;如果所有第二位而且都相同,比较第三位。比较函数其实也可以用递归做。

找到的数会被移出数组,从后部拼接到组成的数中。

将剩下的数组成的数组作为参数,递归。

 

答案的思路异常巧妙!

在上面的思路中,递归的核心部分就是如何比较,从而从数组中选出一个数返回。

答案中给出了更加简洁的比较思路:

定义compare(void *str1, void *str2)其实就是两个字串,然后调用strcmp比较 str1str2和str2str1这两种拼接方式结果的大小。基于这种compare方式选出的最小字符串,就是上面递归函数中要返回的数。

 

答案基于这个compare函数做得更绝:根本没用递归函数,先把数组元素转化字符串,再基于这个compare做个排序,再把排序结果相连,结束了。

posted on 2014-01-27 02:09  Felix Fang  阅读(127)  评论(0)    收藏  举报

导航