NO.1 给定两个排序后的数组A和B,其中A的末端有足够的缓冲空容纳B。编写一个方法,将B合并入A并排序。
解法:联系插入排序,遍历B中元素,逐个插入到A中即可。
NO.2 编写一个方法,对字符串数组进行排序,将所有变位词排在相邻的位置。
解法:变位词如word与rowd就是一组,首先将字符串排序,作为键值插入到哈希表中,最后再将哈希表复制到数组中即可。
NO.3 给定一个排序后的数组,包含N个整数,但这个数组已被旋转很多次,次数不详。请编写代码找出数组中的某个元素。可以假定数组元素原先是按从小到大的顺序排列的。
解法:数组向右旋转M位,如,char data[]="abcde", M = 2,旋转以后data 应该为cdeab,可以发现不管旋转多少次,数组至多存在一个拐点,且拐点两侧是有序的,因此,我们可以采用二分查找,首先比较中间元素是否与S相等,若不等判断左右两端元素与中间元素的关系,找到有序的一半,然后判断元素是否在有序的数组范围内,若不在就在另一半范围内查找,递归即可找到元素,以上是针对无重复的数组的方法,时间复杂度为O(logN)。针对可能存在重复的数组,若左右两端元素和中间元素相等,此时就需要我们左右两侧同时查找,时间复杂度为O(N)。
NO.4 设想你有一个20GB的文件,每一行一个字符串。请说明将如何对这个文件进行排序。
解法:采用外部排序,将待排序文件分块,比如每块x MB,x是可用的内存大小,然后每次从文件中读取一块并进行排序,然后存回到文件系统。各个块完成排序后,将这些块逐一合并起来,就能得到排好序的文件。
NO.5 有个排序后的字符串数组,其中散步着一些空字符串,编写一个方法,找出给定字符串的位置。
解法:二分查找,不过每次取中间字符串的是否判断是否为空串,若为空则循环往左右两侧寻找非空字符串以替代该串,最终找到给定字符串的位置,时间复杂度为O(logN).
NO.6 给定M*N矩阵,每一行、每一列都按升序排列,请编写代码找出某元素。
解法:可以针对每一行二分查找判断是否存在与之相等的,时间复杂度为O(M*logN)。可以考虑动右上方或者左下方开始进行比较,比如从右上方元素开始比较,若M比元素小,则最后一列不可能存在与其相等的了,若M比元素大,则第一行都小于M了,然后在移动x或者y坐标直至找到元素。
NO.7 有个马戏团正在设计叠罗汉的表演节目,一个人要站在另一人的肩膀上。出于实际和美观的考虑,在上面的人要比下面的人矮一点、轻一点。已知马戏团每个人的高度和重量,请编写代码计算叠罗汉最多能叠几个人。
解法:针对重量进行排序,对应产生一个高度序列,寻找高度的最大递增序列即可。
NO.8 假设你正在读取一串整数。每隔一段时间,你希望能找出数字x的秩(小于或等于x的值的数目)。请实现数据结构和算法支持这些操作。也就是说,实现track(int x)方法,每读入一个数字都会调用该方法;以及getRankOfNumber(int x)方法,返回值为小于或等于x的元素个数(不包括x本身)。
解法:若采用数组,每次读取整数后插入排序,找出x的秩就是其位置,不过需要大量的移动,不推荐。二叉查找树比较方便,设置为平衡的,插入方便,获取秩可以根据中序遍历树确定。也可以在树节点处记录小于它的元素个数,每次在左侧插入的时候,就增加1,动态调整右边的所有元素。