- 博客(19)
- 收藏
- 关注
原创 To_review_100_5---Karp Rabin算法的整理
思路: 先比较模式串与主串对应字串的哈希值: 若不同,模式串右移一位进行比较; 若相同,比较模式串以及主串对应字串的每一个字符:1. 若相同,返回找到模式串;2. 若不同,模式串右移一位进行比较;更详细参考:http://blog.csdn.net/onezeros/article/details/5531354C++代码:#i
2015-06-26 21:35:33 290
原创 To_review_100_4---Horspool算法的整理
思路: 从后往前进行匹配。 遇到模式串与主串不匹配时,根据主串的最后一个字符R的情况,模式串向右进行移动: 1. 当模式串中不存在R时,直接越过R,向右移动模式串长度 2. 当模式串中存在R时,找出模式串中最右的R'=R,并向右移动模式串,使得模式串的R’对上主串的R例子: STEP1—— 主串:s u b s
2015-06-25 08:43:56 321
原创 To_review_100_3---Sunday算法的整理
PS:前两天在看KMP算法以及BM算法时被虐哭了= =,今天看Sunday算法感觉好爽^_^,后面再整理几个模式匹配的算法,最后比较一下这几个模式匹配算法的性能思路: 遇到模式串与主串不匹配时,根据主串中参加匹配的最末字符的下一位字符R的情况,模式串向右进行移动: 1. 当模式串中不存在R时,直接越过R,向右移动模式串长度+1 2. 当模式串中存在R时,找出模式串
2015-06-24 21:45:45 422
原创 To_10_r_100_8_5---不用乘法或加法增加8倍。现在用同样的方法增加7倍
题目:不用乘法或加法增加8倍。现在用同样的方法增加7倍思路:15(10)=000001111(2)>>2 000000011(2)=3 —— 相当于15/(2^2)=315(10)=000001111(2) 000111100(2)=60 —— 相当于15*(2^2)=60增加8倍:n增加7倍:nC++代码:略
2015-06-23 21:51:02 884
原创 To_review_100_1---KMP算法的整理
主题:非回溯KMP算法用途:模式匹配算法、在主串中寻找一个模式(简单来说就是在一个长串中找一个短串......)参数:S为主串,n是主串的字符个数;P为子串,m是子串的字符个数;来源:最原始的模式匹配程序 1. 主串与子串向左对齐 2. 比较主串与子串重合的部分 3. 若重合部分一致,则返回主串的位置;若重合部分非
2015-06-20 17:31:42 370
原创 To_10_r_100_8_4---用一种算法在一个循环的链接表里插入一个节点,但不得穿越链接表
题目: 用一种算法在一个循环的链接表里插入一个节点,但不得穿越链接表。(个人理解:就是要在头结点和尾结点间插入元素)思路: 感觉太简单,感觉理解错了吧......不就p->next!=head的话,就可以在p后面插入新元素么.......我想静静......C++代码: 略
2015-06-20 11:54:15 1129
原创 To_review_100_1---循环链接表的整理
主题:整理的是带头结点的单循环链表关键: 1. 头结点不存储链表元素 2. 带头结点的单循环链表分为设置头指针以及设置尾指针两种判断空链表的条件: 头指针:head==head->next; 尾指针:rear==rear->rear;特点: 1. 循环链表中没有NULL指针。涉及遍历操作时,其终止条件就不再是像非
2015-06-20 11:39:26 622
原创 To_10_r_100_8_3---颠倒一个链接表的顺序(递归以及非递归方式)
题目: 用一种算法来颠倒一个链接表的顺序。现在用递归以及非递归的方法实现。思路: 就是把链接表分为一对一对(pair1, pair2)进行处理。如a1->a2->a3->NULL 第一对:(NULL,a1) 第二对:(a1,a2) 第三对:(a2,a3) 第四对:(a3,NULL)——完毕C++代码(含递归以及非递
2015-06-20 11:29:06 821
原创 To_10_r_100_8_2---如果你只能将金条切割两次,你怎样分给这些工人?
题目: 你让一些人为你工作了七天,你要用一根金条作为报酬。金条被分成七小块,每天给出一块。如果你只能将金条切割两次,你怎样分给这些工人?思路: 类似于找零问题答案: 把金条切割两次,按照1:2:4比例分为3份,分别标号为a1,a2,a4。 流程: 第一天:把a1给予工人 第二天:把a2给予工人,收回a1
2015-06-20 09:58:11 957
原创 To_10_r_100_8_1---判断出三盏灯分别是由哪个开关控制的
题目: 有两间房,一间房里有三盏灯,另一间房有控制这三盏灯的开关(这两间房是分割开的,毫无联系).现在要你分别进这两间房一次,然后判断出这三盏分别是由哪个开关控制,你能想出办法吗?(注意:每间房只能进一次)思路: 单单利用灯的亮灭并不足以完成任务,需要考虑除了亮灭的另外的不同点,比如发热答案: 由于工作时间长的灯泡的温度高,工作时间短的温度低,
2015-06-20 09:46:45 578
原创 To_10_r_100_7---关于链表的环以及相交问题的整理
!参考网络资料和自己的理解整理而得题目:1. 如何判断是否有环?答:如果有两个头结点指针,一个走的快,一个走的慢,那么若干步以后,快的指针总会超过慢的指针一圈而相遇。 感性理解:就像是时钟的分针以及秒针一样。 定量分析:当fast与slow相遇时,show肯定没有走完链表,而fast已经在还里走了n(n>= 1)圈。假设slow走了s步,那么fast走了
2015-06-13 09:50:43 489
原创 To_10_r_100_6---根据上排给出十个数,在其下排填出对应的十个数
! 根据网络资料以及自己理解方式重新整理题目:要求下排每个数都是先前上排那十个数在下排出现的次数。 上排的十个数如下: 【0,1,2,3,4,5,6,7,8,9】例子说明: 共n个数值数值: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 —— a[0], a[1], ...,a[n-1]分配: 6, 2,
2015-06-12 16:23:49 496
原创 To_10_r_100_5---查找最小的K个元素
题目:输入n个整数,输出其中最小的K个。思路:1. 复杂度O(nlogn) :快排之类,然后输出最小的K个。2. 复杂度O(kn) :遍历找k次最大值3. 堆排序O(n+klogn):建堆O(n),取出k个最小值O(klogn)。C++代码:3. 堆排序// Heap classtemplate class heap{
2015-06-12 00:37:02 479
原创 To_review_100_0---堆的整理
引入: 一些按照重要性或优先级来组织的对象称为优先队列。 在普通队列数据结构中查找具有最高优先级元素的时间代价为O(n),因而普通队列不能有效地实现优先队列。 在有序表或无序表中插入和删除的时间代价都是O(n)。 可以考虑使用把记录按优先级组织的BST,其平均情况下插入和删除操作的总时间代价为O(nlogn),平均时间代价为O(logn)。但是BST可能会变
2015-06-11 13:28:52 407
原创 To_10_r_100_4---在二元数中找出某一值的所有路径
题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。例如输入整数 22 ,如下图二元树: 10 / \
2015-06-10 09:03:31 427
原创 To_10_r_100_3---求子数组的最大和
题目:输入一个整形数组,数组里有整数也有负数。数组中连续的一个或多个整数组成一个字数组,每个字数组都有一个和。求所有字数组的和的最大值。要求时间复杂度为O(n)。例如:输入数组:1,-2, 3, 10,-4, 7, 2,-5其最大的子数组为3, 10,-4 ,7 ,2输出:18思路:贪心算法,从左到右进行扫描求和,若得到的和比存储的最大值要大,则需要更新
2015-06-09 22:37:48 487
原创 To_10_r_100_2---设计包含min函数的栈
题目:设计包含min函数的栈定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。方法一:思路:栈中的每个元素维护一个min元素C++代码实现:struct MinStackElement{ int value; int min;};class MinStack{pub
2015-06-08 17:25:06 427
原创 To_10_r_100_1---N个孩子站成一排,给每个人设定一个权重(已知)。按照如下的规则分配糖果
题目:N个孩子站成一排,给每个人设定一个权重(已知)。按照如下的规则分配糖果: (1)每个孩子至少分得一颗糖果 (2)权重较高的孩子,会比他的邻居获得更多的糖果。问:总共最少需要多少颗糖果?请分析算法思路,以及算法的时间,空间复杂度是多少。思路:先把每个孩子的糖初始化为1,经过两轮扫描:第一轮:保证后面比前面权值高的孩子,必定多得1个糖果第二轮:保证前面比后面权值高的孩子,必定多得1个糖果把分
2015-06-07 23:53:51 2361
原创 To_10_r_100_0---把二元查找树转变成排序的双向链表
题目:把二元查找树转变成排序的双向链表输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。10/ \6 14/ \ / \4 8 12 16转换成双向链表4=6=8=10=12=14=16。首先我们定义的二元查找树节点的数据结构如下:struct BSTreeNode{int m_nVa
2015-06-06 21:47:49 558 2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人