随笔分类 - Algorithm
摘要:Q:输入二叉树中的两个结点,输出这两个结点在数中最低的共同父结点。 A:对于一个子树的根结点来说,如果那两个结点分别位于该子树的左右子树,则最低共同父结点为该子树的根结点,如果那两个结点都位于该子树的左子树,则最低共同父结点位于该子树根结点的左子树,否则来自右子树。于是递归代码就出来了。 struct Node{ int val; Node *left,*right;};Node* ...
阅读全文
摘要:Q:题目:数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字。 A:如果将数组排序,则相同的数字肯定会在一起,因为该数字的个数超过数组长度的一半,所以该数字组成的子数组肯定会跨过数组的中间位置,所以直接返回arr[n/2]即可。不过这个方法需要先排序。 在考虑另一种方案,如果每次删除两个不同的数字,则在剩下的数组中该数字出现的次数仍然超过一半,所以就把该问题转化为一个规模更...
阅读全文
摘要:上图表示一个trie树,有abc,abcd,abd,b,bcd,efg,hii七个字符串,红色点代表为一个字符串的最后一个字符。 上图同样表示一个trie树,有abc,d,da,dda四个字符串,字符串尾部同样进行了标记。 已知n个由小写字母构成的平均长度为10的字符串,判断其中是否存在某个串为另一个串的前缀子串,有三种方法: 1、遍历字符串集合,对于遍历的每两个字符串,判断其...
阅读全文
摘要:Q:实现函数double Power(double base, int exponent),求base的exponent次方。不需要考虑溢出。 A:这是一道很简单的题,但是考虑全面和优化代码却不是那么容易,一开始乍一看可能就写出这样的代码 double Power(double base,int exponent){ double result=1.0; for(int ...
阅读全文
摘要:Q:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”。A:对于这个题目,办法就是遍历第一个字符串,每次遍历时查找该字符是否在第二个字符串中,如果在,则要删除该字符。所以该问题就分为两步,查找和删除。按照最笨的做法,查找使用线性查找,即对于每一个字符,遍历第二个字符串,看是否出现。这样时间复杂度太高,如果第一个字符串长度为m,第二个字符串长度为n,则时间复杂度为O(mn)。再看删除,最笨的方法是,对于每一个要删除的字符,将其后的每一个字符都向前挪一位,这样时间
阅读全文
摘要:Q:如何判断一个单链表是否有环,如果有环,找出环的入口点?A:首先我们判断链表是否有环,设置两个指针slow和fast,指向单链表的头部,每个循环slow走一步,fast走两步。如果没有环,fast或者fast的next会走到NULL,否则fast在环里循环最终会和slow相遇,此时即存在环。再看第二个问题,当slow和fast相遇时,假设fast已经在环内循环n圈,环长为r,同时fast走的长度为slow走的长度的两倍,设slow走了s步,则有2*s=s+n*r => s=n*r,再设单链表头部到环入口的距离为a,环入口到相遇点得距离为x,则a+x=s=n*r,因此从单链表头部到相遇点
阅读全文
摘要:Q:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。A:将数组的每一个元素进行异或,得到的两个不同数字之间的异或,因为这两个数字不同,所以异或值必然不为0,所以我们找出异或值的一个为1的数位,按照该数位是否为0将数组分成两个子数组A和B,可以知道数组A含有的元素中有两个不同数字的一个,其他都是两两相同的数字;数组B含有的元素中有两个不同数字的另外一个,其他也都是两两相同的数字,再分别进行异或,即可求得两个数。 1 #include <iostream> 2 using namespace s
阅读全文
摘要:Q:输入一个字符串,输出该字符串中字符的所有组合。 A:假设一个字符串长度为n,要求长度为m的所有组合。我们考虑字符串中一个字符,我们有两种选择:将其加入组合或者不加入组合。当加入组合时,我们还需要从该字符后面的子串中选取m-1个字符;当不加入组合时,我们需要从该字符后面的子串中选取m个字符,所以递归+回溯即可解出。 #include <iostream>#include <vect...
阅读全文
摘要:Q:输入一个字符串,打印出该字符串中字符的所有排列 A:以abc为例,我们首先将a固定在第一位,然后排列bc,当bc排列完成后,我们会将b固定在第一位,也就是交换a和b的位置,变成bac,然后排列ac,当ac排列完成后,我们需要将c固定在第一位,先将a和b的位置复原,在交换a和c的位置即可。因此,用递归来求解再自然不过。对于字符串abcdedfgh….,在以begin为开头的子串中,我们要...
阅读全文
摘要:Q:一个数组是由一个递减数列左移若干位形成的,比如{4,3,2,1,6,5} 是由{6,5,4,3,2,1}左移两位形成的,在这种数组中查找某一个数。 A:任意将这个数组从中间分开,分成两个数组,则至少有一个数组单调递减,另一个数组则可以由递减数组左移若干位得到,所以我们在二分之后确定界限的时候必须考虑所有情况,即需要查找的数组在哪一个分区里。 首先我们需要判断哪一个分区是单调递减的...
阅读全文
摘要:#include <iostream>using namespace std;//匹配数int num=0;//判断当前n对括号是否匹配bool isMatch(int n,char* bracket){ int left_num=0,right_num=0; for(int i=0;i<2*n;++i) { if(bracket[i]=='l') left_num++; else if(...
阅读全文
摘要:1、求有向图的强连通分量 如果有向图G中的任何两个顶点都相互可达,则G称为一个强连通图。非强连通图的极大强连通子图称为有向图的强连通分量。 Tarjan算法是根据图的深度优先搜索,定义DFN(u)为顶点u在DFS中的次序编号,Low(u)为u或u的子树能够追溯到的最早的栈中顶点的次序编号,则 Low(u)=min{DFN(u),Low(v) if(u,v)是树枝边,DFN(v) if(...
阅读全文
摘要:输入:字符串A,B输出:B是否为A的子串算法:设A的长度为n,B的长度为m,即A=A[1…n],B=b[1…m]。假设有两个索引:i,j,并且满足A[i-j+1…i]=B[1…j]相等,也就是说以i结尾的长度为j的A中子串匹配以j结尾的长度为j的B中子串。初始时i=j=0。现在要判断A[i+1]是否和B[j+1]是否相等,如果相等,则i和j都增加1,并且当j等于m时说明B是A的子串;如果不相等,则要重新规划j的值,变成j’,使得A[i-j'+1…i]=B[1…j'],那么怎么确定j’的值呢?要想满足A[i-j'+1…i]=B[1…j'],且已知条件A[i-j+1
阅读全文
摘要:View Code 1 /* 2 题目:求1+2+…+n, 3 要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)。 4 */ 5 6 7 class Calculation 8 { 9 public:10 Calculation()11 {12 ++n;13 sum+=n;14 }15 static void Reset()16 {17 n=0;18 sum=0;19 }20 static int GetS...
阅读全文
摘要:View Code 1 #include <iostream> 2 using namespace std; 3 4 const int SIZE=10; 5 6 int getFrequency(int index,int* bottom) 7 { 8 int count=0; 9 for(int i=0;i<SIZE;++i)10 {11 if(bottom[i]==index)12 count++;13 }14 return count;15 }16 17 void Calc(const int* Up...
阅读全文
摘要:View Code 1 //计算达到相同字符串的操作个数 2 int SimuDegree(char* a,char* b) 3 { 4 int lenA=strlen(a); 5 int lenB=strlen(b); 6 if(lenA==0 || lenB==0) 7 return abs(lenA-lenB); 8 if((*a)==(*b)) 9 return SimuDegree(a+1,b+1);10 else11 {12 13 return min(min(Simu...
阅读全文
摘要:一、排序1、应用a、一些程序需要有序的输出,二分查找之类的程序需要一个有序的输入。b、收集相同项:使用排序来收集序列中相同的项,后缀数组收集相同的单词。2、算法a、插入排序:O(n^2)的最坏时间,如果给一个大致有序的数组进行排序,则只需要O(n)时间,是稳定的。b、快速排序:最优时间O(nlogn),最坏情况O(n^2)时间O(n)空间c、堆排序:任何情况都是O(nlogn)时间d、其他:归并排序,选择排序,希尔排序e、基数排序f、位图排序:序列中的整数在一个范围内,没有重复的数,没有额外的数据。二、查找1、算法a、线性查找b、二分查找:有序数组c、哈希d、二叉查找树e、关键字索引:bins
阅读全文
摘要:首先是letter-level的马尔科夫链然后是word-level的马尔科夫链word-level 1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 5 //输入的字符串 6 char inputchars[4300000]; 7 #define MAXWORDS 80000 8 //字符串中没一个单词 9 char *word[MAXWORDS]; 10 //单词个数 11 int nword=0; 12 //k-order 13 int k=2; 14 15 //has
阅读全文
摘要:input:m,n and m<noutput:a sorted list of m random integers in the range 0...n-1View Code 1 void genknuth(int m,int n) 2 { 3 for(int i=0;i<n;++i) 4 { 5 if((bigrand()%(n-i))<m) 6 { 7 cout <<i<<endl; 8 --m; 9 }10 }11 }12 13 14 void gensets(in...
阅读全文
摘要:1.Save state to avoid recomputation2.Preprocess information into data structures3.Divide-and-conquer algorithms4.Scanning algorithms5.Cumulatives
阅读全文
浙公网安备 33010602011771号