摘要: 最近碰到一个问题,就是从控制台读取一组数,如: 12 23 34 56 若是使用1 int data;2 while ( cin >> data ) {//...} 当回车后,不能有效转换到后面。除非输入非数字字符才能导致循环结束。这是因为cin在读取输入时,忽略空格和回车键等。 使用cin.get()可以从控制台中读取空格键,因此这段代码就可以改变为:1 int data;2 vector room;3 while ( cin >> data )4 { 5 room.push_back( data );6 if ( cin.get() == ... 阅读全文
posted @ 2013-10-14 10:50 life91 阅读(4222) 评论(0) 推荐(0) 编辑
摘要: 1. 将绝对路径转换成相对路径。例如, input: /home/news/../tmp/game/../; ouptut: /home/tmp/ 思路:利用栈的思想。每次遇到".."时,将退栈至上一个'/'位置。 1 #include 2 #include 3 #include 4 5 char *convert_path_opt( const char *path ) 6 { 7 char *result = NULL; 8 int top = 0; 9 int path_len = 0,10 index ... 阅读全文
posted @ 2013-09-11 09:02 life91 阅读(2619) 评论(5) 推荐(5) 编辑
摘要: 问题:数组a1[0, mid-1]和a1[mid,num-1]都分别有序。将其merge成有序数组a1[0,num-1],要求空间复杂度为O(1),时间复杂度为O(n). 问题来自:http://blog.csdn.net/column/details/ms100.html 这个问题的关键点就是在于:如何降低空间复杂度。解决关键:考虑左边数组与右边数组交换元素的个数。若左边数组在交换过程中,还有剩余元素没有交换。也就是说,左边数组剩余数组元素还是大于已交换元素的。 例如,{ 1, 2, 23, 24, 36, 74, 7, 10, 12, 38, 44, 84 }, mid = 6 ... 阅读全文
posted @ 2013-08-30 10:16 life91 阅读(240) 评论(0) 推荐(0) 编辑
摘要: 问题出自blog:http://blog.csdn.net/v_july_v/article/details/6803368 问题描述:有n个正实数(按照大小升序排列),另一个实数m。需要算出若干个x,使这个几个x的和与m最接近。请描述实现算法啊,并指出算法复杂度。 利用贪婪算法,从后向前仅考虑当前计算结果最接近实数m的值,时间复杂度O(n) 源代码: 1 #include 2 #include // for srand(), rand() 3 #include // for time() 4 5 int which_sum_is_near_number( co... 阅读全文
posted @ 2013-08-22 15:31 life91 阅读(226) 评论(0) 推荐(0) 编辑
摘要: 问题出自blog:http://blog.csdn.net/v_july_v/article/details/6803368 问题:高效统计一篇英文文章里出现的所有单词,按照在文章中首次出现的顺序打印出该单词和它出现的次数。 解决方式:利用Trie完成单词匹配,然后利用链表来统计单词出现的个数。 源代码: 1 #include 2 #include // for calloc(), free() 3 #include // for strlen(), memset() 4 5 enum { BranchSize = 26, StringSize ... 阅读全文
posted @ 2013-08-21 10:31 life91 阅读(1110) 评论(0) 推荐(0) 编辑
摘要: 1 #include 2 #include // for calloc(), free() 3 #include // for assert() 4 5 /* 2013.7.12 6 * 问题:设计一个算法,找出二叉树上任意两个结点的最近共同父节点。 7 * PS. 结点中数据均不同 8 */ 9 typedef struct TreeNode TreeNode; 10 typedef struct ListNode ListNode; 11 12 struct TreeNode 13 { 14 int m_nValue; 15 T... 阅读全文
posted @ 2013-07-12 09:25 life91 阅读(678) 评论(0) 推荐(0) 编辑
摘要: 问题出自《编程之美》3.1 1 /* 2013.6.25 2 * 问题:给定两个字符串s1和s2,要求判定给定字符串s2是否 3 * 能够通过字符串s1循环移位得到的字符串包含。 4 * 例如: 5 * 1. s1 = AABCD,s2 = CDAA,则返回true; 6 * 2. s1 = ABCD,s2 = ACBD,则返回false 7 */ 8 #include 9 #include 10 #include 11 12 enum { true = 1, false = 0 }; 13 14 /* 2013.6.25 15 * 方式1:用s2... 阅读全文
posted @ 2013-06-25 09:40 life91 阅读(241) 评论(0) 推荐(0) 编辑
摘要: 进程间通信方式有多种,包括管道、FIFO、消息队列、共享内存、信号量等。 1. 半双工管道 该方式只能在具有公共祖先的进程之间使用。通常,一个管道由一个进程创建,然后进程通过fork函数创建一个子进程,因此父、子进程之间就可以应用该管道作为父子之间的通信方式。 函数pipe()创建管道:#include <unistd.h>int pipe(int fileds[2]); 其中,参数fileds返回两个文件描述符:filefds[0]为读而打开,fileds[1]为写而打开,且fileds[1]的输出作为fileds[0]的输入。如图所示: 图1 单进程中半双... 阅读全文
posted @ 2013-06-08 09:20 life91 阅读(191) 评论(0) 推荐(0) 编辑
摘要: 1. 基本操作 套接子是通信端点的抽象。套接字描述符作为套接字的标识符,它是以一种文件形式存在的。如果通信端点是一个“人”,那么套接字标识符就是人的“身份证”。 函数socket()用来创建一个套接字,并获得套接字描述符。1 #include <sys/socket.h>2 int socket(int domain, int type, int procotol);3 // 成功返回套接字描述符;出错返回-1 其中,参数domain确定通信特征,它包括AF_INET,AF_INET6,AF_UNIX; 参数type确定套接字的类型:SOCK_DGRAM:是长度固定... 阅读全文
posted @ 2013-06-07 16:10 life91 阅读(232) 评论(0) 推荐(0) 编辑
摘要: 有关线程创建:【Linux 编程】线程编程 当多个控制线程共享相同的数据时,需要确保每一个线程看到一致的数据。当一个线程修改数据变量时,其他线程在读取这个变量值时就可能会看到不一致的数据。在变量修改时间多于一个存储访问的处理结构中,当存储器读取或存储器写这两个周期交叉时,潜在的数据不一致性就会出现。为了解决这种数据不一致性的问题,线程利用锁机制来保证在保证数据的一致性问题。若读取数据或写数据操作是原子操作,则不存在数据竞争或数据不一致性问题。 1. 互斥锁(pthread_mutex_t) 互斥锁保证同一时间只允许一个线程访问数据。任何其他试图获取已加锁的互斥锁,就会被阻塞直到当前线... 阅读全文
posted @ 2013-06-05 10:41 life91 阅读(206) 评论(0) 推荐(0) 编辑