俊介三

一天更新一点,一天积累一点

导航

2013年3月30日

摘要: 队列的应用场景为:一个生产者线程将int类型的数入列,一个消费者线程将int类型的数出列贴个win下的代码,貌似java的多线程更方便点。(后来看《Java并发实践》及《Core Java 1》最后一章再来~)#include <windows.h> #include <stdio.h> #include <stdlib.h> typedef HANDLE Semaphore; //信号量的Windows原型 #define P(S) WaitForSingleObject(S, INFINITE) // 定义Windows下的P操作 #defi... 阅读全文

posted @ 2013-03-30 14:16 俊介三在前进 阅读(353) 评论(0) 推荐(0)

2013年3月28日

摘要: 输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来.#include <stdio.h>#include <list>using namespace std;void find(int n, int m){ static list<int> mylist; if(n<0 || m<0) return; if(m>0){ mylist.push_front(n); find(n-1,m-n); mylist.pop_front(); find(n-... 阅读全文

posted @ 2013-03-28 16:45 俊介三在前进 阅读(156) 评论(0) 推荐(0)

摘要: 输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点。用递归和循环两种方法完成树的镜像转换。 例如输入: 8 / \ 6 10/\ /\5 7 9 11输出: 8 / \ 10 6 /\ /\11 9 7 5非递归版本采用栈来实现:#include <stdio.h>#include <stack>using namespace std;struct Node{ int data; Node* left; Node* right; Node(){} Node(int d){ data = d; ... 阅读全文

posted @ 2013-03-28 14:20 俊介三在前进 阅读(144) 评论(0) 推荐(0)

摘要: 题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回true,否则返回false。例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果: 8 / \ 6 10 / \ / \ 5 7 9 11因此返回true。如果输入7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,因此返回false。思路:后序遍历意味着数组最后一个元素一定是根。再根据binary search tree的特点,左子树一定比根小,右子树一定比根大来递归地检查左右子树。代码:#include <stdio.h>bool ispostorder(int* ar 阅读全文

posted @ 2013-03-28 13:06 俊介三在前进 阅读(158) 评论(0) 推荐(0)

摘要: 用一种算法来颠倒一个链接表的顺序。递归和不递归的方法:#include <stdio.h>#include <stdlib.h>struct List{ int data; List* next; List(){} List(int d){ data = d; next = NULL; } List(int d, List* list){ data =d; next = list; }};//append an element to tailList* appendToTail(int data,... 阅读全文

posted @ 2013-03-28 12:03 俊介三在前进 阅读(278) 评论(0) 推荐(0)

摘要: 给出两个单向链表的头指针,比如h1,h2,判断这俩个链表是否相交.(注意要考虑此链是否带环)#include <stdio.h>#include <stdlib.h>struct List{ int data; List* next; List(){} List(int d){ data = d; next = NULL; } List(int d, List* list){ data =d; next = list; }};//append an element to tailList* app... 阅读全文

posted @ 2013-03-28 09:52 俊介三在前进 阅读(133) 评论(0) 推荐(0)

2013年3月27日

摘要: 题目:输入n个整数,输出其中最小的k个。例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。(当然:涉及真正工程项目不会这样”就事论事“,还要看为什么要找其中最小K个?这K个需不需要排序了?以后会不会变成找最大K个?等问题,要考虑到业务原因。直接给它用O(nlogn)排序好了!)思路:就遍历一遍这n个数,每次尝试放入容量为k的优先队列中。不知道这个复杂度怎么算?貌似维护一个长度为k的优先队列复杂度是O(klogk)吗?这样O(nklogk)比O(nlogn)优吗?!不知道 :(#include <stdio.h>#include <queue& 阅读全文

posted @ 2013-03-27 21:20 俊介三在前进 阅读(115) 评论(0) 推荐(0)

摘要: 题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。例如 输入整数22和如下二元树 10 / \5 12 / \ 4 7则打印出两条路径:10, 12和10, 5, 7。这个问题最近做得烂透了。思路:把需要带到叶子的中间结果作为参数放在递归函数里,每次往里加~(我再看看别人又是如何写的。。)我的代码:#include <iostream>#include <stdlib.h>#include <stack>#include <queue>using namespace 阅读全文

posted @ 2013-03-27 20:53 俊介三在前进 阅读(126) 评论(0) 推荐(0)

摘要: 题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18。找到状态转移方程,dp[i]表示前i个数中,包含i的子数组的最大和。要么第i个数自己最大,要么他要和包含i-1的子数组最大和(即dp[i-1])联合在一起.即dp[i] = max{arr[i],dp[i-1]+arr[i]};代码如下;#include <stdio.h>#de 阅读全文

posted @ 2013-03-27 20:31 俊介三在前进 阅读(100) 评论(0) 推荐(0)

摘要: 题目:定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。思路:最初以为不就push进来,对比一下已有的,再标记当前最小的嘛。。后来发现,pop出去的时候,有可能min就不同了,恢复不了之前min的值,囧。应该再开辟一个栈(称为栈B),栈B和原栈(称为栈A)同步push,同步pop,且栈B的顶是栈A最小值的index,这样同步push和pop就能保证一直维护这这个min代码:#include <stdio.h>#include <iostream>#include <memory.h>s 阅读全文

posted @ 2013-03-27 20:15 俊介三在前进 阅读(167) 评论(0) 推荐(0)