![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
试题 - 算法/数据结构
chen19870707
大家一起多交流~!
展开
-
网易有道笔试:求连通图的割点
题目:求一个连通图的割点,割点的定义是,如果除去此节点和与其相关的边,图不再连通,描述算法。分析:1. 最简单也是最直接的算法是,删除一个点然后判断连通性,如果删除此点,图不再连通,则此点是割点,反之不是割点(图的连通性一般通过深搜来判定,是否能一次搜索完 全部顶点);2. 通过深搜优先生成树来判定。从任一点出发深度优先遍历得到优先生成树,对于树中任一顶点V而言,其孩子节点为邻接点。由原创 2012-09-03 11:31:05 · 111 阅读 · 0 评论 -
一串首尾相连的珠子(m个),有N种颜色(N<=10),设计一个算法,取出其中一段,要求包含所有N中颜色,并使长度最短
#include using namespace std;#define N 3bool GetMinlen(int *a,int m,int &shortHead,int & shortlen){ int start=0,end = 0; int countColor = 0; int *colorArray = new int[N]; shortlen = m; sho原创 2012-09-14 09:33:40 · 6741 阅读 · 0 评论 -
题目:用递归颠倒一个栈。例如输入栈{1, 2, 3, 4, 5},1在栈顶。颠倒之后的栈为{5, 4, 3, 2, 1},5处在栈顶。
#include #include using namespace std;void PushToButtom(stack *s,int o){ if(s->empty()) { s->push(o); return; } else { int o2 = s->top(); s->pop(); PushToButtom(s,o); s->push(o2)原创 2012-09-14 09:27:40 · 3186 阅读 · 0 评论 -
如果字符串一的所有字符按其在字符串中的顺序出现在另外一个字符串二中,则字符串一称之为字符串二的子串。
题目:如果字符串一的所有字符按其在字符串中的顺序出现在另外一个字符串二中,则字符串一称之为字符串二的子串。注意,并不要求子串(字符串一)的字符必须连续出现在字符串二中。请编写一个函数,输入两个字符串,求它们的最长公共子串,并打印出最长公共子串。例如:输入两个字符串BDCABA和ABCBDAB,字符串BCBA和BDAB都是是它们的最长公共子串,则输出它们的长度4,并打印任意一个子原创 2012-09-14 09:27:45 · 8132 阅读 · 0 评论 -
有n个长为m+1的字符串,如果某个字符串的最后m个字符与某个字符串的前m个字符匹配,则两个字符串可以联接,问这n个字符串最多可以连成一个多长的字符串,如果出现循环,则返回错误。
有n个长为m+1的字符串,如果某个字符串的最后m个字符与某个字符串的前m个字符匹配,则两个字符串可以联接,问这n个字符串最多可以连成一个多长的字符串,如果出现循环,则返回错误。分析一下,将各个字符串作为一个节点,首尾链接就好比是一条边,将两个节点连接起来,于是问题就变成一个有关图的路径长度的问题。链接所得的字符串最长长度即为从图的某个节点出发所能得到的最长路径问题,与最短路径类似,可以应用弗洛原创 2012-09-14 09:30:35 · 2854 阅读 · 0 评论 -
n个骰子的点数
把n个骰子扔在地上,所有骰子朝上一面的点数之和为S。输入n,打印出S的所有可能的值出现的概率。#include #include void SumProbabilityOfDices(int number, int* pProbabilities);void SumProbabilityOfDices(int original, int current, int value, int原创 2012-09-14 09:27:11 · 567 阅读 · 0 评论 -
输入一个正数n,输出所有和为n连续正数序列。
例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以输出3个连续序列1-5、4-6和7-8。分析:这是网易的一道面试题。#include using namespace std;void findSumSear(int n){ int small = 1,big = 2; int mid = (n+1)/2; int sum = small+big; if(原创 2012-09-14 09:27:54 · 3935 阅读 · 0 评论 -
求一个连通图的割点
题目:求一个连通图的割点,割点的定义是,如果除去此节点和与其相关的边,图不再连通,描述算法。分析:1. 最简单也是最直接的算法是,删除一个点然后判断连通性,如果删除此点,图不再连通,则此点是割点,反之不是割点(图的连通性一般通过深搜来判定,是否能一次搜索完 全部顶点);2. 通过深搜优先生成树来判定。从任一点出发深度优先遍历得到优先生成树,对于树中任一顶点V而言,其孩子节点原创 2012-09-14 09:35:14 · 2094 阅读 · 0 评论 -
图的基本操作(基于邻接矩阵):图的构造,深搜(DFS),广搜(BFS)
图的基本操作(基于邻接矩阵):图的构造,深搜(DFS),广搜(BFS)原创 2012-09-14 09:36:40 · 5927 阅读 · 0 评论 -
求一个数组的最长递减子序列 比如{9,4,3,2,5,4,3,2}的最长递减子序列为{9,5,4,3,2}
问题描述:给出一个数列,找出其中最长的单调递减(或递增)子序列。解题思路:动态规划。假设0到i-1这段数列的最长递减序列的长度为s,且这些序列们的末尾值中的最大值是t。对于a[i]有一下情况:(1) 如果a[i]比t小,那么将a[i]加入任何一个子序列都会使0到i的最长单调序列长度变成s+1,这样的话,在0到i的数列中,长度为s+1的递减子序列的末尾值最大值就是a[i];(2) 如原创 2012-09-14 09:32:21 · 3069 阅读 · 0 评论 -
一道看上去很吓人的算法面试题:如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1)
看上去似乎任何已知的算法都无法做到,如果谁做到了,那么所有的排序方法:QuickSort,ShellSort,HeapSort,BubbleSort等等等等,都可以扔掉了,还要这些算法干吗阿,呵呵。不过实际上,在数字范围有限制的情况下,是有一个这样的算法的,只需要用一个数组记录每个数字出现次数就可以了。假定你的数字范围在0到65535范围之内,定义一个数组count[65536](这个转载 2012-09-04 09:16:28 · 2463 阅读 · 1 评论 -
设计一个栈结构,满足一下条件:min,push,pop操作的时间复杂度为O(1)。
#include #include using namespace std;#define MAXN 100struct Data{ int data; int minData;};class MinStack{public: Data **data; int top; int size;public: MinStack() { size =MAXN;原创 2012-09-03 13:32:22 · 2535 阅读 · 0 评论 -
有n个长为m+1的字符串,如果某个字符串的最后m个字符与某个字符串的前m个字符匹配,则两个字符串可以联接,问这n个字符串最多可以连成一个多长的字符串,如果出现循环,则返回错误。
有n个长为m+1的字符串,如果某个字符串的最后m个字符与某个字符串的前m个字符匹配,则两个字符串可以联接,问这n个字符串最多可以连成一个多长的字符串,如果出现循环,则返回错误。分析一下,将各个字符串作为一个节点,首尾链接就好比是一条边,将两个节点连接起来,于是问题就变成一个有关图的路径长度的问题。链接所得的字符串最长长度即为从图的某个节点出发所能得到的最长路径问题,与最短路径类似,可以应用原创 2012-09-02 15:48:51 · 204 阅读 · 0 评论 -
一串首尾相连的珠子(m个),有N种颜色(N<=10),设计一个算法,取出其中一段,要求包含所有N中颜色,并使长度最短
#include using namespace std;#define N 3bool GetMinlen(int *a,int m,int &shortHead,int & shortlen){ int start=0,end = 0; int countColor = 0; int *colorArray = new int[N]; shortlen = m; sho原创 2012-09-03 15:51:13 · 146 阅读 · 0 评论 -
求一个二叉树中任意两个节点间的最大距离
求一个二叉树中任意两个节点间的最大距离,两个节点的距离的定义是这两个节点间边的个数,比如某个孩子节点和父节点间的距离是1,和相邻兄弟节点间的距离是2,优化时间空间复杂度。struct Node{ int value; Node *left; Node *right; int maxLeft; int maxRight;};int MaxDistance(Node原创 2012-09-02 16:51:37 · 1548 阅读 · 0 评论 -
求一个数组的最长递减子序列 比如{9,4,3,2,5,4,3,2}的最长递减子序列为{9,5,4,3,2}
问题描述:给出一个数列,找出其中最长的单调递减(或递增)子序列。解题思路:动态规划。假设0到i-1这段数列的最长递减序列的长度为s,且这些序列们的末尾值中的最大值是t。对于a[i]有一下情况:(1) 如果a[i]比t小,那么将a[i]加入任何一个子序列都会使0到i的最长单调序列长度变成s+1,这样的话,在0到i的数列中,长度为s+1的递减子序列的末尾值最大值就是a[i];(2) 如原创 2012-09-03 21:54:08 · 96 阅读 · 0 评论 -
一个数组是由一个递减数列左移若干位形成的,比如{4,3,2,1,6,5}是由{6,5,4,3,2,1}左移两位形成的,在这种数组中查找某一个数。
采用二分查找#include using namespace std;int binarySearch(int *a,int first,int last,int value){ int mid = first + (last-first)/2; if(a[mid] == value) return mid; else if(a[mid]<value) { return原创 2012-09-04 09:11:53 · 1772 阅读 · 0 评论 -
一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值
一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值 比如{3,2,4,3,6}可以分成{3,2,4,3,6} m=1; {3,6}{2,4,3} m=2 {3,3}{2,4}{6} m=3 所以m的最大值为3 #include using namespace std;int testShare(int *a,int n,int m,int原创 2012-09-03 20:36:37 · 2385 阅读 · 0 评论 -
四对括号可以有多少种匹配排列方式?比如两对括号可以有两种:()()和(())
回溯法可以用来求解排列组合问题回溯法框架void backtrack (int t){ if (t>n) output(x); else for (int i=f(n,t);i<=g(n,t);i++) { x[t]=h(i); if (constraint(t)&&bound(t)原创 2012-09-03 20:56:11 · 1371 阅读 · 0 评论 -
图的基本操作(基于邻接表):图的构造,深搜(DFS),广搜(BFS)
#include #include #include using namespace std;#define MAXN 100struct ArcNode{ int adjVertex; //边到的顶点 ArcNode *next;};struct VNode{ string data; ArcNode *firstArc;};typedef VN原创 2012-09-14 09:35:48 · 5325 阅读 · 0 评论