面试归来,问几道牛逼UNIX C/C++笔试题
1、从N个数中选出n个最大的数,写出思路和实现。
《编程之美》上有讲这个算法的设计与思路。
我这里简单写几个思路:
(a)如果N能在主存中一次读入,则先进行快排,然后再取前n个数。算法复杂度:O(NlogN).
(b)如果N非常大,假设不能一次读入内存,并且n不是很大的话,可以维护一个n个元素的有序队列,队列中都是每个元素都是已经读入的数中的
前n大的数字。每读入一个数就跟这n个已排序的队列进行比较,如果大于这n个元素中最小的那个元素,则替换之,由此继续,直到读取完毕,得到的有序队列就是n个最大的数。算法复杂度:O(N * n)
(c)假如对于重复出现的数只计一次,那么可以使用位向量的方法,一次读入N个数,如果某数出现则把对应的位置位。读取完毕后输出最高位的n个数。关于位向量的方法详见《编程珠玑》。该算法的复杂度是O(N)
(d)假如N能够存入主存。因为我们只关心前n个数,所以,可以借鉴快速排序的思想,随机取一个数作为枢纽元,大于枢纽的数存入一个集合A,小于枢纽的数存入一个集合B,如果集合A的元素数目大于n,则再次分割集合A。如果集合A的元素小于n,则前n大元素是 A的元素 + B中最大的(n - A的元素个数)。该算法如果枢纽元选择的好的话,收敛的很快。比(a)快很多。
2、写出一个c/s通讯程序,要求服务器端用非阻塞模式。
3、TCP/UDP的异同。
这个太泛泛了,主要说说TCP的可靠传输机制和UDP的传输机制的区别吧。面试的时候问这个问题我觉得应该跟面试官交流一下,看看他的明确意思,抓住重点的回答。
4、32位平台上,有个2G的文件,全是4字节整数,整数的最大值不超过8亿,这些整数重复最多不超过2次,给你条件:200M可用内存,5G硬盘空间,要把这些整数排序,不排除重复的数据。
貌似这个是要考外部排序。思路比较简单,每次读入200M的数据,在内存中快排,然后分别写到文件A,B中,一趟完后是这样的形式
文件A 1 3 5 7 9
文件B 2 4 6 8 10(其中 数字每个代表200M的数据)
然后归并排序,依次读入 A1的一个数 和 B2的一个数,进行归并排序,然后写到文件 C,D中,这一趟完后C,D的存储形式如下
文件C 1 3 5
文件D 2 4(其中每个数字代表400M的数据)
依次继续归并,最后能得到排序结果。
ps:应该还有更快更直接的算法,因为上面有的已知条件没有使用到。(全是4字节整数,整数的最大值不超过8亿)
补充:可以使用位图法!
5、什么是精灵程序,写出一个精灵程序的实现。
详见APUE 13章
相关文档:
系统环境:Windows 7
软件环境:Visual C++ 2008 SP1 +SQL Server 2005
本次目的:编写一个航空管理系统
这是数据库课程设计的成果,虽然成绩不佳,但是作为我用VC++ 以来编写的最大程序还是传到网上,以供参考。用VC++ 做数据库设计并不容易,但也不是不可能。以下是我的程序界面,后面 ......
1. C++虽然主要是以C的基础发展起来的一门新语言,但她不是C的替代品,不是C的升级,C++和C是兄弟关系。没有谁比谁先进的说法,更重要的一点是C和C++各自的标准委员会是独立的,最新的C++标准是C++98,最新的C标准是C99。因此也没有先学C再说C++的说法,也不再(注意这个"不再")有C++语法是C语法的超集的说法。
2. C++/CL ......
#include <windows.h>
int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nShowCmd )
{
OPENFILENAME ofn;
//在内存中开辟一块空间,存放用户选取的文件名
char szFile[MAX_PATH];//MAX_PATH ......