![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
一些有意思的面试题
zw_1510
github:https://github.com/zw1510
展开
-
有序数组旋转的问题
1、有序数组旋转后寻找数组中的最小值一般情况下我们的第一反应肯定是遍历此数组,但这肯定不是我们所期望的,因为此数组是有序数组旋转而成,所以我们此时应该想到用二分法来寻找数组中的最小值。假设我们给定递增数组{0,1,2,3,4,5,6,7,8,9}旋转后的数组有下面几种形式{6,7,8,9,0,1,2,3,4,5}{9,0,1,2,3,4,5,6,7,8}{0,1,2,3,4,5原创 2016-06-16 17:19:08 · 1840 阅读 · 0 评论 -
在数组中快速找到只出现一次的数
在一个已知数组中,只有一位数只出现一次,其余数均出现两次,如何快速找到这个数。常规方法,通过一一比较,找出只出现一次的数,代码如下#include#includeint main(){ int i = 0, j = 0; int arr[10] = {0,1,2,3,0,2,3,1,10}; for (i = 0; i { for (j = 0; j { if (i != j) {原创 2016-06-12 10:13:55 · 376 阅读 · 0 评论 -
字符串的旋转问题
例如字符串arr[]="abcde";左旋一位为"bcdea";第一种方法也是比较容易想到的方法,根据移动的位数,逐个给新元素赋值,代码如下//#include//#include//#include//left_mv(char *str, int num)//若不重新定义数组,之前需要移动的数组便会被重新赋值,导致数组后面无法正确赋值,AABB左移两位,BBBB//{// char a[5];/原创 2016-06-12 10:13:53 · 292 阅读 · 0 评论 -
二叉树——重建二叉树
问题:给定二叉树的前序遍历结果和中序遍历结果,恢复出原二叉树。假设二叉树中的元素都不重复,给定二叉树的前序遍历序列{1,2,4,7,3,5,6,8},二叉树的中序遍历序列{4,7,2,1,5,3,8,6}。看到此题,我首先想到的是寻找根节点,由前序遍历序列可以看出根节点为1,此时通过中序遍历可以看出来4,7,2在根节点的左子树,5,3,8,6在树的右节点。此时我们可以发现序列中每一段都是符合前序或中原创 2016-07-16 01:14:08 · 303 阅读 · 0 评论 -
两个栈实现一个队列,两个队列实现一个栈
问题1:用两个栈实现一个队列,实现队列的push和delete操作 栈的特性是先进后出(FILO),队列的特性是先进先出(FIFO),在实现delete时,我们的难点是如何将栈中最底层的数据拿出来,我们有两个栈,所以我们可以将一个栈中的数据依次拿出来压入到另一个为空的栈,另一个栈中数据的顺序恰好是先压入栈1的元素此时在栈2的上面,为了实现效率的提升,我们在delete时,判断栈2是否有数据,如果有原创 2016-07-17 00:32:26 · 17667 阅读 · 0 评论 -
二叉树问题——寻找二叉树中两个节点的最近公共祖先
此题大概分为3种情况: 1、节点中无parent,但提供了root 2、节点中有parent,但未提供root 3、此二叉树是二叉搜索树解决方法: 前面两种情况都是想办法将此题转换为求解两个相交链表的交点: 第一种情况需要我们将两个节点到root的路径保存起来,此时路径就好像是链表; 第二种情况比第一种情况还要简单些,我们只需要不断向前找,直至parent为空,统计两个节点的深度,此时依原创 2016-08-04 22:49:39 · 829 阅读 · 0 评论 -
二叉树系列问题——判断一棵树是否为完全二叉树
解决此问题关键点就是理解完全二叉树的特点,完全二叉树定义如下: 若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。如下图: 判断一棵树是否为完全二叉树主要使用的算法是层序遍历,在层序遍历中,只要遇到一个节点的左右子树之一不为空,则立即将标志位置为true,在后面的子树中若遇到不为空的节点则该树不是原创 2016-08-06 21:31:51 · 744 阅读 · 0 评论 -
二叉树系列问题——求二叉树中最远节点的距离
求二叉树中最远节点的距离,我们首先要对最远距离有清晰的认识,最远距离分为以下三类情况 因此我们在计算距离时总要与前一次的距离作比较,只有当此次左右距离之和大于max值才更改max的值,我们可以使用后续遍历来计算最远距离,此时时间复杂度为O(N),使用前序遍历也是可以的,但时间复杂度为O(N*N),综合比较我们选择后续遍历。实现方法写在一个搜索树中了。 代码如下:#pragma onc原创 2016-08-07 14:08:09 · 764 阅读 · 0 评论 -
面试遇到的问题
1、迭代器失效问题 最重要的问题是v.erase()返回值是当前删除节点的下一个节点,第一次写代码时,虽然想到了,但一时脑热,写出了下面的代码 vector<int>::iterator it = v.begin(); while (it != v.end()) { if ((*it) == 3) { v.erase(i原创 2016-09-28 22:08:31 · 324 阅读 · 0 评论