【有趣的面试算法题】之六 把正数集中的数排列成一个最小的数,最高位升序排列就好
2013-10-25 11:11
155 查看
在《剑指offer 名企面试官精讲典型编程题》中的面试题33:把数组排成最小的数, 并假定数值都为正。 作者提出一个复杂度为O(n*logn)的基于排序思路的方案,并对此给出了详细的代码及论证。
但是,我发现还可以进一步进行优化! 就是其比较函数中的具体实现中并不需要将两个数拼装之后再比较,而是直接比较两个数,可以省去大量的数据移动! 只是这时,需要自己写一个函数代替函数strcmp()。
新写的函数比较思路是:排在前面的数字应当小才是,于是总是比较两个数的较高位数字。
具体实施流程可以这样:
1,先比较两个数的最高位。如果两个数字不相同,直接返回结果;如果相同,则比较次高位。
2,如果两个数据长度不一,则较短的后续一直使用个位数字与较长的后续位进行比较。
附上原作者的文章截图:
但是,我发现还可以进一步进行优化! 就是其比较函数中的具体实现中并不需要将两个数拼装之后再比较,而是直接比较两个数,可以省去大量的数据移动! 只是这时,需要自己写一个函数代替函数strcmp()。
新写的函数比较思路是:排在前面的数字应当小才是,于是总是比较两个数的较高位数字。
具体实施流程可以这样:
1,先比较两个数的最高位。如果两个数字不相同,直接返回结果;如果相同,则比较次高位。
2,如果两个数据长度不一,则较短的后续一直使用个位数字与较长的后续位进行比较。
附上原作者的文章截图:
相关文章推荐
- 给定一个有序的数组,元素各不相同且按升序排列,编写一个算法,创建一棵高度最小的二叉查找树?
- 【Java】给定一个有序整数数组,元素各不相同且按照升序排列,编写一个算法,创建一个高度最小的二叉查找树
- 给定一个有序整数数组,元素各不相同且按照升序排列,编写一个算法,创建一个高度最小的二叉查找树
- 程序员面试金典: 9.4树与图 4.3给定一个有序整数数组,元素各不相同且按升序排列,创建一颗高度最小的二叉查找树。
- 【有趣的面试算法题】之四 求最小不重复数,源于百度2014届校园招聘软件研发岗位深圳站
- 有两个序列A和B,A=(a1,a2,...,ak),B=(b1,b2,...,bk),A和B都按升序排列,对于1<=i,j<=k,求k个最小的(ai+bj),要求算法尽量高效
- 给定一个有序数组,元素各不相同且升序排列,创建一个高度最小的二叉查找树
- 有N个正实数(注意是实数,大小升序排列) x1 , x2 ... xN,另有一个实数M。 需要选出若干个x,使这几个x的和与 M 最接近。 请描述实现算法,并指出算法复杂度
- 一个既有负数又有正数的升序数组中,找出其绝对值最小的数
- 微软等数据结构+算法面试100题(2)--给出一个函数来输出一个字符串的所有排列
- 程序员面试金典: 9.4树与图 4.3给定一个有序整数数组,元素各不相同且按升序排列,创建一颗高度最小的二叉查找树。 ---快速解法
- 有两个序列A和B,A=(a1,a2,...,ak),B=(b1,b2,...,bk),A和B都按升序排列。对于1<=i,j<=k,求k个最小的(ai+bj)。要求算法尽量高效。
- 一个组合加全排列的面试算法题及其解
- 有两个序列A和B,A=(a1,a2,...,ak),B=(b1,b2,...,bk),A和B都按升序排列。对于1<=i,j<=k,求k个最小的(ai+bj)。要求算法尽量高效。
- 陈利人 面试题 对于一个n位正整数a,去掉其中任意k(k<=n)个数字后,剩下的数字按原次序排列可以组成一个新的正整数。设计一个删数算法,使得剩下的数字组成的正整数最小。
- 对于一个n位正整数a,去掉其中任意k(k<=n)个数字后,剩下的数字按原次序排列可以组成一个新的正整数。设计一个删数算法,使得剩下的数字组成的正整数最小。例如,a=13243221,k=5,输出:12
- 对于一个m*n的整数矩阵,其中每一行和每一列的元素都按升序排列,设计一个高效的算法判断一个数值是否存在,并给出位置
- 算法爱好者——算法题:上一个排列 ? 待解决
- java练习——求数组的最大值、最小值并升序降序排列
- ios面试算法题(5)——扑克发牌、最小和差问题、V字图形打印