![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
文章平均质量分 67
zbcdzbcd
这个作者很懒,什么都没留下…
展开
-
面试题之数组篇
转至:http://www.cnblogs.com/graphics/archive/2010/08/24/1761620.html 感谢原作者的收集整理 数组是最基本的数据结构,关于数组的面试题也屡见不鲜,本文罗列了一些常见的面试题,仅供参考,如果您有更好的题目或者想法,欢迎留言讨论。目前有以下18道题目,如果有好的题目,随时更新。 数组求和求数组的最大值和最小值求数组的最大值转载 2014-03-11 14:16:24 · 1299 阅读 · 0 评论 -
一种二分查找变形
原始的二分查找非常简单,只要找到值返回即可;但是如果某原创 2014-09-01 15:30:03 · 722 阅读 · 0 评论 -
子串子序列相关面试题总结
注:子串是连续的,子序列则不连续 1,求最长回文子串 中心法应该是最为常用的办法,时间复杂度O(n^2)。输入字符串假设为”abcdedc";从左到右依次考虑以a为中心最长回文是多少,以ab中间的空为中心最长回文是多少,以b为中心最长回文是多少....... 代码如下: int LPS(char *str, int n) { assert(str != NULL); int le原创 2014-03-28 10:16:34 · 1209 阅读 · 0 评论 -
面试题之链表篇
链表是面试重中之重,但题型比较死,考的是细心。这里做一个总结,会给出模板实现。如果错误,请不吝指教! 1. 判断链表是否有环 2.求链表中间节点(偶数则返回前一个节点) 3.约瑟夫环问题 4. 链表逆序输出(递归) 5. 链表反转(非递归与递归) 6.两个有序单链表的合并(非递归与递归) 7.判断两个单链表是否相交 8.接题7,若相交求第一个交点 9. 删除链表某个节点 10.原创 2013-11-05 15:19:55 · 1590 阅读 · 4 评论 -
面试题之二叉树篇
二叉树是面试中很重要的考点,类似中序非递归遍历、最低公共祖先、镜像、路径求值等问题屡见不鲜。 在这里总结常见的一些题目,并给出模板实现,希望能给求职的朋友一些帮助,也方便自己时时回顾。如有错误,请不吝指教! 1. 有序数组递归建立二叉树 2. 求叶子节点个数 3. 求二叉树深度 4. 求镜像 5. 分层打印,打印一行后换行 6. 判断二叉树是否平衡 8. 判断是否是满二叉树 9.原创 2013-11-05 11:31:00 · 1397 阅读 · 0 评论 -
求字符串编辑距离的递推和递归实现
递推实现: int CalculateDis_DP(char *str1,char *str2) { int i, j; int len1=strlen(str1), len2=strlen(str2); for (i=0;i<=len2;i++) d[0][i]=i; for (i=0;i<=len1;i++)原创 2014-03-26 10:47:58 · 1038 阅读 · 0 评论 -
一道亚马逊面试题(股票买卖问题)
题目:一个股价序列,已知每个时间点的股价,问什么时候买什么时候卖获利最大 这道题O(N)空间复杂度和O(N)时间复杂度都不难想到:假设股价序列由a[N]表示,一种方法是开一个缓冲数组b[N-1],记录a[N]中每两个相邻元素的差值,然后问题转化为求b[N-1]的最大子数组和(当然必须知道最大子数组和的O(N)解法)。第二种方法是开一个缓冲数组b[N],依次存储以当前元素结尾的左侧数组最小值,然后原创 2014-03-20 14:21:03 · 1642 阅读 · 0 评论 -
求数组的逆序数
题目:在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。 现在,给你一个N个元素的序列,请你判断出它的逆序数是多少。 比如 1 3 2 的逆序数就是1。 方法1::O(n^2)这个就不说了。 方法2: 借助归并排序达到O(nlgn)的时间复杂度,当然牺牲了一点空间。 这里主要描述一下方法2,前提是原创 2014-04-01 11:21:28 · 3131 阅读 · 0 评论 -
随机概率相关的面试题
转至:http://blog.csdn.net/luckyxiaoqiang/article/details/8788906 1. 已知有个rand7()的函数,返回1到7随机自然数,让利用这个rand7()构造rand10() 随机1~10。 只调用一次rand7()肯定无法达到目的。我们调用两次rand7(),这样我们可以随机的得到1~49中的一个数,为什么呢? 我们将49分成7段,1~转载 2014-03-19 13:55:35 · 851 阅读 · 0 评论 -
求连续子数组最大乘积
因为数组中存在正负零的情况,所以相比求连续子数组最大和的问题,求最大积稍微复杂一些,不过代码还是很简洁。 假设数组为a[N],max[N] 表示以下标为 i 结尾的子数组乘积最大值,min[N] 表示以下标为 i 结尾的子数组乘积最小值。 为了处理数组元素为负的问题,必须将最小乘积也保存起来。。很容易想到,若当前元素a[i]为负数,那么乘以a[i]*max[i-1]得到的并不一定比a[i]*m原创 2014-03-16 20:44:32 · 3826 阅读 · 0 评论 -
一道腾讯笔试题(已知一个数组,不使用除法构造另一数组)
题目:给定一数组a[N],我们希望构造数组b [N],其中b[j]=a[0]*a[1]…a[N-1] / a[j],在构造过程中,不允许使用除法;要求O(1)空间复杂度和O(n)的时间复杂度。 观察b[j]的构造公式,发现它实际上是由两部分相乘得到。左边是a[i]到a[j-1]的乘积,右边是a[j+1]到a[N-1]的乘积,中间的a[j]被除掉了。接下来就是怎么实现的问题了。先从左向右扫描a[N原创 2014-03-18 10:11:25 · 1162 阅读 · 0 评论 -
栈和队列的相互模拟
1、用两个栈(s1,s2)实现一个队列(q) 基本思想:入队列的时候都进入s1; 出队列的时候分情况,若s2不为空,则直接弹出s2栈顶元素 ,若s2为空,则将s1除栈底元素外依次出栈并压入s2,再弹出s1栈底元素即可。 template class MyQueue { public: void push(T e) { s1.push(e); } T pop() { int原创 2014-02-22 20:49:29 · 806 阅读 · 0 评论 -
打印螺旋数组
已知M和N,要求打印一个M行N列的螺旋矩阵。比如M、N都为3,则打印 1 2 3 8 9 4 7 6 5 我们来看,因为是按螺旋状打印,我们更直观的可以将其理解为分层打印,比如上面的例子分为两层,第一层为:1、2、3、4、5、6、7、8;第二层为:9。 这样我们将问题转化为分层打印,而每一层有四个边,所以我们要考虑的是怎么将四条边合理的打印出来。 为了表示每条边的原创 2014-03-13 16:00:02 · 1189 阅读 · 0 评论 -
打印集合的所有子集
已知一个集合,其子集包括空集和本身。怎样将所有的子集打印出来?最简单的O(N^3)算法不难想到,但是太过于朴素,应该还有更巧的方法。 我们已知,一个元素个数为n的集合,其子集个数为2^n个。比如set { 1, 2 },含有两个元素,一共有四个子集,分别为{ },{ 1 },{ 2 },{ 1,2 }。 我们取一个只有两位的bitset,显然这个两位的bitset只有四种组合,00、01、10、原创 2014-03-12 14:43:30 · 3305 阅读 · 0 评论 -
常用排序算法C语言实现
1,冒泡排序 void BubbleSort(int a[], int n) { int i, j, tmp; int flag = 1; for (i = 0; i < n && flag ; i++) { flag = 0; for (j = 0; j < n - i - 1; j++) if (a[j] > a[j+1]) { tmp = a[j]原创 2014-03-10 21:04:42 · 1101 阅读 · 0 评论