2014年3月17日

摘要: 题目 输入一个链表的头结点,从尾到头反过来打印出每个结点的值。分析 这个题目有三种解法,可以根据实际情况灵活选用。解法一 堆栈法 设立一个堆栈,然后遍历一次链表,其间将数据依次存入堆栈。遍历完之后将所有元素依次出栈并打印即可。 PS:这里堆栈直接用C++中的stack容器适配器实现代码实现( 含测试 ) 1 #include 2 #include 3 4 using namespace std; 5 6 /* 7 * 定义结点类型 8 */ 9 struct ListNode {10 int value;11 ListNode *next;12 };13 14... 阅读全文
posted @ 2014-03-17 22:55 空山悟 阅读(190) 评论(0) 推荐(0) 编辑
摘要: 问题分析 在上篇文章中,给出了使用C语言中经典位运算符来实现位向量的方法。而本文,将介绍使用C++中的bitset容器来实现位向量的方法。实现 1 // 请包含bitset头文件 2 #include 3 4 // 定义一个有100个成员的bitset容器( 位向量 ) 5 bitset b; 6 7 // 将位向量第i位置为1 8 b.set(i); 9 10 // 将位向量第i位置为011 b.reset(i);12 13 // 查看位向量第i位14 b.test(i);15 16 // 在屏幕上打印位向量17 cout << b << endl;小结 使用容器,很 阅读全文
posted @ 2014-03-17 11:58 空山悟 阅读(141) 评论(0) 推荐(0) 编辑
摘要: 问题分析 位向量可以定义为一个模拟数组(整型数组)。所谓的“ 实现位向量 ”也就是定义函数,实现对模拟数组中指定【位】的设置,清空,以及测试。函数实现 1 // 每个整数的位数 2 #define BITSPERWORD 32 3 // 每次位移量 4 #define SHIFT 5 5 // 取模掩码 6 #define MASK 0x1F 7 // 位向量的元素个数 8 #define N 10000000 9 10 // 模拟数组11 int a[1 + N/BITSPERWORD];12 13 /*14 * 函数功能:置位向量第i位为115 * 函数说明:" i>> 阅读全文
posted @ 2014-03-17 11:27 空山悟 阅读(290) 评论(0) 推荐(0) 编辑
摘要: 问题分析 依题意,所需程序不用过多考虑效率且暗示使用库,自然想到用高级语言实现(个人选择C++)。可用顺序容器暂存数据,用标准算法解决排序问题。代码实现 1 #include 2 #include 3 #include 4 #include 5 #include 6 7 using namespace std; 8 9 int main()10 {11 /*12 * 获取数据文件名并打开文件13 */14 string filename;15 cout > filename;17 fstream io;18 io.ope... 阅读全文
posted @ 2014-03-17 11:18 空山悟 阅读(187) 评论(0) 推荐(0) 编辑

2014年3月10日

摘要: 题目 请实现一个函数,把字符串中的每个空格替换成" %20 "。( 假定字符串未使用空间足够且只允许在原字符串上做替换 ) PS:括号内的说明未必会给出,这时候需要和考官进行沟通,了解他具体的需求。差劲的思想 1. 编写一个移位函数,每次调用可将字符串的未处理部分往后移两个位置。 2. 遍历目标字符串,每当遇到空格则先调用1中函数一次,再将空格替换成%20,然后继续遍历。分析 O(n²)的复杂度,显然不会让自己以及面试官满意。 如果能够在遍历的过程中,每次都将处理的字符移动到它最终的位置,那么复杂度就可降低到O(n)。对此,可以采用从后往前遍历的方法,设定两个指针 阅读全文
posted @ 2014-03-10 20:32 空山悟 阅读(255) 评论(0) 推荐(0) 编辑

2014年2月27日

摘要: 题目 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。误区 对于这道题,很多人从一般的角度思考解决方法:比如想到若数组检索对象大于该整数,则可以剔除该元素右下方的所有元素;若数组检索对象小于该整数,则可以剔除该元素左上方的所有元素。 可是然后呢?很多人就在这里卡住了。因为剔除后的区域遍历起来太过复杂,一时半刻谁也想不出来。正解 应当从具体问题入手,通过分析简单具体的例子,发现普遍的规律。 现在假定,我们要从二维数组 1 2 8 9 2 4 9 12 4 7 10... 阅读全文
posted @ 2014-02-27 23:42 空山悟 阅读(401) 评论(0) 推荐(0) 编辑

2014年2月26日

摘要: 题目 如下为类CMyString的声明,请为该类型添加赋值运算符函数。1 class CMyString {2 public:3 CMyString (char * pData = NULL);4 CMyString (const CMyString & str);5 ~CMyString (void);6 7 private:8 char * m_pData;9 };错解 1 class CMyString { 2 public: 3 CMyString (char * pData = NULL); 4 CMyString (const CM... 阅读全文
posted @ 2014-02-26 22:24 空山悟 阅读(355) 评论(0) 推荐(0) 编辑

2014年2月24日

摘要: 前言 在上文中,我使用select函数实现了不为客户连接创建子进程的并发回射服务器( 点此进入 )。但其中有个细节确实有点麻烦,那就是还得设置一个client数组用来标记select监听描述符集中被设置为监听位的位。有没有方法简化这个处理呢?有!在《UNIX网络编程》第六章最后介绍了一种类似select的函数 --- poll函数,用它来实现IO复用使代码简化了不少( 起码并发回射服务器的例子是的 )。poll函数介绍 1. 包含头文件: 2. 函数原型:int poll ( struct pollfd * fdarray, unsigned long nfds, int timeout... 阅读全文
posted @ 2014-02-24 21:57 空山悟 阅读(270) 评论(0) 推荐(0) 编辑
摘要: 前言 在此前,我已经介绍了一种并发回射服务器实现( 点此进入 )。它通过调用fork函数为每个客户请求创建一个子进程。同时,我还为此服务器添加了自动消除僵尸子进程的机制。现在请想想,在客户量非常大的情况下,这种为每个客户请求都创建子进程的做法是不是太费资源了?我们可不可以在不为每个客户请求都创建子进程的前提下实现并发回射服务器?答案自然是肯定的,这也是此文要讲述的方法。实现思路 服务器建立好监听套接字之后,进入以下循环中: 1. 调用select函数,先使之阻塞于监听套接字描述符( 之后阻塞于监听套接字描述符和已连接套接字描述符 )。 2. 当监听套接字描述符被激活,就调用connec... 阅读全文
posted @ 2014-02-24 21:28 空山悟 阅读(382) 评论(0) 推荐(0) 编辑
摘要: 前言 批量处理是指将原先的输入重定向到一个输入文件,这样客户端将连续向服务器发送该文件中的数据,然后接收到服务器的回射数据后,再将其写入到另一个文件中。在这样的情况下,原来的客户端程序不能够再正确运行了。那么会发生什么问题?我们又该如何修改客户端程序才能使之正确工作呢?且看下文。发现问题一 传输线路中数据的丢失 先来看看原客户端中的数据处理函数的一段: 1 if (FD_ISSET(sockfd, &rset)) { 2 if (Readline(sockfd, recvline, MAXLINE) == 0) 3 err_q... 阅读全文
posted @ 2014-02-24 21:03 空山悟 阅读(275) 评论(0) 推荐(0) 编辑

导航