联想到的问题有:
a. 给一个都是正整数的数组,是否存在两个数的和为某个给定的sum? 三个数呢?
针对两个数的情况,可以先排序,然后一个指针front指向第一个元素(最小),一个指针tail指向最后一个元素(最大),如果*front + *tail < sum, ++front, 如果*front + *tail > sum, --tail;
如果三个数,或者N个数,该如何做?
动态规划,类似于01背包问题
f[i][k]表示前i个元素中任意k个元素的和的集合,那么有:
f[i][k] = f[i-1][k] + (f[i-1][k-1] + array[i])
or:
f[i][v]表示前i个元素中是否存在和的v的子数列,那么有:
f[i][v] = 1, only if f[i-1][v]=1 or f[i-1][v-array[i]]=1
3:两个有大量id的集合A和B,数量上亿级,如何求出两个集合的交集,A中有的B中没有的,和B中有的A中没有的集合。
涉及海量数据处理: 二分搜索、位图Bitmap、哈希Hash、字典树、分成若干小文件+多路归并...
4:设计实现一个管理内存的小模块,接口为void* checkout(size_t size), void checkin(void* ptr)。
5: 设计一个数据结构,存储一副象棋子的摆放,尽量压缩空间,使得方便通过传输到另外一台机子上然后恢复棋盘。
6:数组的众数问题,最长递增子序列问题。找大量数据中前k个大的数。找大量数据中第k大的数。
7:一个平面中有很多点,用最快的算法找出相隔最近的两个点。
8:select/poll和epoll,基本互联网公司都会提到这个东西。
9:给敏感词列表,和一大段文本,考虑一个敏感词过滤的算法。
10:海量数据问题,很多,一般方法就为分治、hash、位图。
很多没有标准答案,面试过程中的探讨很重要。找工作不难,找份好工作还是难的,基础知识很重要,数据结构和算法、操作系统、编程语言的掌握,数据库和网络。可以根据自己的喜好,偏向于某个方向。