随笔分类 -  数据结构和算法

摘要:摘自:https://blog.csdn.net/bigtree_3721/article/details/82945924 一般人见到这种题目,立马就会想到指针交换。是的,大家被指针交换的题目做多了,形成思维定势了。对于这道题,我们完全可以利用值交换来达到排序的目的。当然,怎么值交换? 很多人得第 阅读全文
posted @ 2022-04-14 10:36 simon1024 阅读(50) 评论(0) 推荐(0)
摘要:优点: (1)拉链法处理冲突简单,且无堆积现象,即非同义词决不会发生冲突,因此平均查找长度较短; (2)由于拉链法中各链表上的结点空间是动态申请的,故它更适合于造表前无法确定表长的情况; (3)开放定址法为减少冲突,要求装填因子α较小,故当结点规模较大时会浪费很多空间。而拉链法中可取α≥1,且结点较 阅读全文
posted @ 2020-10-20 10:11 simon1024 阅读(367) 评论(0) 推荐(0)
摘要:原文:https://www.sohu.com/a/120595688_465979 Vector 就像是 C++ STL 容器的瑞士军刀。Bjarne Stoutsoup 有一句话 – “一般情况下,如果你需要容器,就用 vector”。像我们这样的普通人把这句话当作真理,只需要照样去做。然而,就 阅读全文
posted @ 2018-07-04 21:15 simon1024 阅读(13449) 评论(0) 推荐(0)
摘要:题目:从源字符串中删除给定的字符串“ab”,如源字符串为“fbaabbcdab”,删除“ab”后为“fbcd”。要求:不能使用string,不用递归,时间复杂度O(n)。分析:此题借鉴微软的一道面试题,采用快慢指针实现一次扫描完成删除操作。与微软那道题目不同的是,此题的慢指针存在回退的情况。void deleteab(char* str){ if (str == NULL) return; char* s = str; char* f = str+1; //标兵 char pacer = '0'; while( *s!='\0' ) { if( *s!=' 阅读全文
posted @ 2013-08-25 16:23 simon1024 阅读(474) 评论(0) 推荐(0)
摘要:题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”。分析:这是一道微软面试题。在微软的常见面试题中,与字符串相关的题目占了很大的一部分,因为写程序操作字符串能很好的反映我们的编程基本功。要编程完成这道题要求的功能可能并不难。毕竟,这道题的基本思路就是在第一个字符串中拿到一个字符,在第二个字符串中查找一下,看它是不是在第二个字符串中。如果在的话,就从第一个字符串中删除。但如何能够把效率优化到让人满意的程度,却也不是一件容易的事情。也就是说,如何在第一个字符 阅读全文
posted @ 2013-08-25 15:13 simon1024 阅读(213) 评论(0) 推荐(0)
摘要:待写 阅读全文
posted @ 2013-08-14 11:14 simon1024 阅读(342) 评论(0) 推荐(0)
摘要:题目:列出九宫格键盘输入的所有字母组合思路:将字母的组合看成k进制的数,列出字母组合的过程即为对数进行加法运算。#include #include #include char* letter[] = {"abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};void listAll(char* input){ int len = strlen(input); int total = 1; i 阅读全文
posted @ 2013-08-09 08:19 simon1024 阅读(413) 评论(0) 推荐(0)
摘要:bool BinTree::is_avl(BintreeNode *r, int& height){ if (r == NULL) { height = 0; return true; } int hl,hr; bool is_avl_left = is_avl(r->get_left(), hl); if ( !is_avl_left ) return false; bool is_avl_right = is_avl(r->get_right(), hr); if ( !is_avl_right ) return false; int max = hl>hr ? 阅读全文
posted @ 2013-08-09 08:17 simon1024 阅读(186) 评论(0) 推荐(0)
摘要:给定一个长度为N的整数数组,只允许用乘法,不能用除法,计算任意(N-1)个数的组合中乘积最大的一组,并写出算法的时间复杂度问题:给定一个长度为N的整数数组,只允许用乘法,不能用除法,计算任意(N-1)个数的组合中乘积最大的一组。我们可以把所有可能的(N-1)个数的组合找出来,分别计算它们的乘积,并比较大小。由于总共有N个(N-1)个数的组合,总的时间复杂度为O(N2),显然这不是最好的解法。OK,以下解答来自编程之美解法1解法一:采用空间换时间的策略,用两个数组分别记录原整数数组前缀与后缀的叠乘积(前缀s[i]=),再以间隔1个数的方式将这两个数组乘起来就得到所有n-1个数的乘积数组(具体看代 阅读全文
posted @ 2013-08-01 09:42 simon1024 阅读(313) 评论(0) 推荐(0)
摘要:本文将总结一种数据结构:跳跃表。前半部分跳跃表性质和操作的介绍直接摘自《让算法的效率跳起来--浅谈“跳跃表”的相关操作及其应用》上海市华东师范大学第二附属中学 魏冉。之后将附上跳跃表的源代码,以及本人对其的了解。难免有错误之处,希望指正,共同进步。谢谢。 跳跃表(Skip List)是1987年才诞生的一种崭新的数据结构,它在进行查找、插入、删除等操作时的期望时间复杂度均为O(logn),有着近乎替代平衡树的本领。而且最重要的一点,就是它的编程复杂度较同类的AVL树,红黑树等要低得多,这使得其无论是在理解还是在推广性上,都有着十分明显的优势。 首先,我们来看一下跳跃表的结构 跳跃表由多条链构成 阅读全文
posted @ 2013-05-26 20:00 simon1024 阅读(194) 评论(0) 推荐(0)
摘要:1.已知链表的头结点head,写一个函数把这个链表逆序[cpp]viewplaincopyvoidList::reverse(){list_node*p=head;list_node*q=p->next;list_node*r=NULL;while(q){r=q->next;q->next=p;p=q;q=r;}head->next=NULL;head=p;}递归方法:[cpp]viewplaincopyvoidList::reverse2(list_node*curnode){if(curnode==NULL)curnode=head;if(curnode->n 阅读全文
posted @ 2013-05-23 18:56 simon1024 阅读(222) 评论(0) 推荐(0)
摘要:12345678910111213141516171819202122232425262728293031structBinaryTreeNode{intvalue;BinaryTreeNode*left,*right;};booldoestree1havetree2(BinaryTreeNode*root1,BinaryTreeNode*root2);boolhassubtree(BinaryTreeNode*root1,BinaryTreeNode*root2){//noticethatresultisstaticstaticboolresult=false;if(root1!=NULL& 阅读全文
posted @ 2013-05-23 18:53 simon1024 阅读(115) 评论(0) 推荐(0)
摘要:GivenaBST(BinarysearchTree)howwillyoufindmedianinthat?Constraints:*Noextramemory.*Functionshouldbereentrant(Nostatic,globalvariablesallowed.)*Medianforevennoofnodeswillbetheaverageof2middleelementsandforoddnooftermswillbemiddleelementonly.*Algorithmshouldbeefficientintermsofcomplexity.中文不需要赘述了,就是二叉搜 阅读全文
posted @ 2013-05-23 18:00 simon1024 阅读(1383) 评论(0) 推荐(0)
摘要:将一个整数拆分成不重复的整数之和。example:6=1+5=1+2+3=2+4采用递归方法实现。12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182#include<iostream>#include<vector>usingnamespacestd;/**6=1+5=1+2+3=2+4**/voidsplit(i 阅读全文
posted @ 2013-05-23 17:56 simon1024 阅读(214) 评论(0) 推荐(0)
摘要:方法一、不用栈void reverseChar(char* str, int len){ char* q = str+len-1; char* p = str; if (!len) return; while( pst;stackword;char*p=str;st.push('\0');while(*p!='\0'){while(*p=='')st.push(*p++);if(*p=='\0')break;while(*p!='\0'&&*p!='')word.push(*p++) 阅读全文
posted @ 2013-05-23 17:42 simon1024 阅读(319) 评论(0) 推荐(0)
摘要:问题:求字符串str1,str2的最长公共子串的长度。1.动态规划方法算法:定义二元函数函数f(m,n):分别以str1[m],str2[n]结尾的连续公共子串的长度而对于f(m+1,n+1)有以下两种情况1.str1[m+1]!=str2[n+1],则有f(m+1,n+1)=02.str1[m+1]==str2[n+1],则有f(m+1,n+1)=f(m,n)+1另外f(0,j)=0(j>=0)f(j,0)=0(j>=0)算法的c++代码实现如下:12345678910111213141516171819202122232425262728293031intcommstr(cha 阅读全文
posted @ 2013-05-23 17:40 simon1024 阅读(191) 评论(0) 推荐(0)
摘要:作者:July、youwang、yanxionglu。时间:二零一一年三月二十六日说明:本文分为俩部分,第一部分为10道海量数据处理的面试题,第二部分为10个海量数据处理的方法总结。有任何问题,欢迎交流、指正。出处:http://blog.csdn.net/v_JULY_v。第一部分、十道海量数据处理面试题1、海量日志数据,提取出某日访问百度次数最多的那个IP。首先是这一天,并且是访问百度的日志中的IP取出来,逐个写入到一个大文件中。注意到IP是32位的,最多有个2^32个IP。同样可以采用映射的方法,比如模1000,把整个大文件映射为1000个小文件,再找出每个小文中出现频率最大的IP(可以 阅读全文
posted @ 2013-05-23 15:23 simon1024 阅读(468) 评论(0) 推荐(0)
摘要:有25匹马,速度都不同,但每匹马的速度都是定值。现在只有5条赛道,无法计时,即每赛一场最多只能知道5匹马的相对快慢。问最少赛几场可以找出25匹马中速度最快的前3名?(百度2008年面试题)每匹马都至少要有一次参赛的机会,所以25匹马分成5组,一开始的这5场比赛是免不了的。接下来要找冠军也很容易,每一组的冠军在一起赛一场就行了(第6场)。最后就是要找第2和第3名。我们按照第6场比赛中得到的名次依次把它们在前5场比赛中所在的组命名为A、B、C、D、E。即:A组的冠军是第6场的第1名,B组的冠军是第6场的第2名……每一组的5匹马按照他们已经赛出的成绩从快到慢编号:A组:1,2,3,4,5B组:1,2 阅读全文
posted @ 2013-05-23 15:21 simon1024 阅读(168) 评论(0) 推荐(0)
摘要:有25匹马,速度都不同,但每匹马的速度都是定值。现在只有5条赛道,无法计时,即每赛一场最多只能知道5匹马的相对快慢。问最少赛几场可以找出25匹马中速度最快的前3名?(百度2008年面试题)每匹马都至少要有一次参赛的机会,所以25匹马分成5组,一开始的这5场比赛是免不了的。接下来要找冠军也很容易,每一组的冠军在一起赛一场就行了(第6场)。最后就是要找第2和第3名。我们按照第6场比赛中得到的名次依次把它们在前5场比赛中所在的组命名为A、B、C、D、E。即:A组的冠军是第6场的第1名,B组的冠军是第6场的第2名……每一组的5匹马按照他们已经赛出的成绩从快到慢编号:A组:1,2,3,4,5B组:1,2 阅读全文
posted @ 2013-05-19 18:44 simon1024 阅读(593) 评论(0) 推荐(0)
摘要:算法内容来源于网络,本人增加对算法的证明。百度面试题:现在有一个数组,已知一个数出现的次数超过了一半,请用O(n)的复杂度的算法找出这个数。 答案1: 创建一个hash_map,key为数组中的数,value为此数出现的次数。遍历一遍数组,用hash_map统计每个数出现的次数,并用两个值存储目前出现次数最多的数和对应出现的次数。 这样可以做到O(n)的时间复杂度和O(n)的空间复杂度,满足题目的要求。 但是没有利用“一个数出现的次数超过了一半”这个特点。也许算法还有提高的空间。 答案2: 使用两个变量A和B,其中A存储某个数组中的数,B用来计数。开始时将B初始化为0。 ... 阅读全文
posted @ 2013-05-19 18:41 simon1024 阅读(399) 评论(0) 推荐(0)