利用位图排序
问题:一个最多包含n个正整数的文件,每个数都小于n,n = 1000 0000。文件中的正整数没有重复的,请按升序排列这些整数。可用内存空间只有1MB左右,运行时间在10秒左右。
解决方法:使用一个具有1000万个位的为序列表示这个文件中的所有整数。当且仅当整数 i 在文件中时,第 i 位为1。用C++具体实现的话,可用使用位域bitset来实现。bitset<10000000> my_bitset;
找出一个不在文件中的数
问题:给定一个最多包含40亿个随机排列的32位整数的顺序文件,找出一个不在文件中的32bit表示的整数。
解决方法:因为32bit可用表示的最大无符号整数为小43亿,所以一定存在至少一个这样的整数。具体解决方法为,利用二分查找的思想,通过统计中间点之上和之下的元素个数来探测范围:或者上面或者下面的范围具有至多全部范围的一半元素。
向量abcdefgh向左旋转3个位置
问题:将向量abcdefgh向左旋转 i=3 个位置。
解决方法:翻转算法。
1: reverse(0, i-1); /* cbadefgh */
2: reverse(i, n-1); /* cbahgfed */
3: reverse(0, n-1); /* defghabc */
此方法可用通过翻转左右手来进行演示和理解,十个手指分别代表十个数1~10。
找出变位词
问题:找出字典中的变位词,如stop和tops。
解决办法: 分为3步。第一步,给每个单词增加一个标识,标识由该单词的字母排序后组成,这样,变位词就具有了相同的标识符。第二步,按照标识符对单词进行排序。第三步,输出。如果用C语言实现的话,需要用到一个qsort 函数,类似于C++ STL中的排序算法。