常见数据结构与算法面试题
Kaycsdner
Nothing is impossible for a willing heart!!!
展开
-
二叉树中和为某一值的路径
题目:输入一颗二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始一直到叶节点所经过的节点形成的一条路径。解答:采用类似于前序遍历的过程,依次累加节点值,直到到达叶子节点并且累加和与期望值相等,就打印路径。struct TreeNode{ int m_data; TreeNode* m_pLeft; TreeNode* m_pRight; TreeNod原创 2015-11-06 11:25:23 · 492 阅读 · 0 评论 -
二分查找,你真的懂吗
转载至:http://duanple.blog.163.com/blog/static/709717672009049528185/作者:phylips@bmy最近在练习动态规划问题(DP),其中“最长递增子序列”问题中要用到二分查找,突然发现二分查找并非我们想象的那么简单。例如如何确定停止条件,不同的问题如何增加下边界和减少小边界,如何确保问题规模变小而不进入死循环?下面这篇文章很好的解转载 2017-09-24 11:26:38 · 1245 阅读 · 1 评论 -
最长递增子序列
转载至:http://blog.csdn.net/u013074465/article/details/45442067最长递增子序列http://blog.csdn.net/lisonglisonglisong/article/details/45241965最长递增子序列(Longest Increasing Subsequence)是指找到一个给定序列的最转载 2017-09-19 21:43:41 · 511 阅读 · 0 评论 -
Hamming Weight的算法分析
转载至:http://www.cnblogs.com/jawiezhu/p/4395063.html参考:wikipediaHamming Weight的算法分析最容易想到的算法是除余法,继而考虑到除法的代价较高,而且除数是2,会想到使用向右移位来代替除法,并使用&0x1操作来取末位的值,这样提高了算法的效率。然而,这样仍然进行了63次&操作、63次移位操作和63次转载 2017-06-05 22:34:42 · 564 阅读 · 0 评论 -
Minimum Moves to Equal Array Elements(最少移动步长使数组中元素相等)
今天在leetcode上遇到一个问题,就是如何在最小移动步数下使数组中元素相等,每次仅能移动n-1个元素,而且每次只能加1?其实这就是一个简单的数学问题,我们可以假设在m次移动后,所有元素达到相等,且相等值为val,那么,我们可以建立等式如下:sum + m*(n-1) = val*n;(其中,sum是原始数组元素之和,n为元素个数),实际上,我们还有一个等式,那就是m步后val的值:原创 2017-04-22 10:07:24 · 549 阅读 · 0 评论 -
二叉树的遍历
参考至:http://www.cnblogs.com/dolphin0520/archive/2011/08/25/2153720.html二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有前序、中序以及后序三种遍历方法。因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法转载 2017-04-17 22:13:44 · 334 阅读 · 0 评论 -
博弈问题简介
参考:http://blog.csdn.net/pipisorry/article/details/39249337博弈问题简介所讨论的博弈问题满足以下条件:玩家只有两个人,轮流做出决策游戏的状态集有限,保证游戏在有限步后结束,这样必然会产生不能操作者,其输对任何一种局面,胜负只决定于局面本身,而与轮到哪位选手无关一般称满足以上条件的游戏称为ICG,比如转载 2017-04-04 12:24:05 · 1531 阅读 · 0 评论 -
Digital Root(数根推导)
今天在leetcode上面碰到了在O(1)时间解决数根问题,后来发现运用数学公式确实可以在常数时间内解决。For base b (decimal case b = 10), the digit root of an integer is:dr(n) = 0 if n == 0dr(n) = (b-1) if n != 0 and n % (b-1) == 0dr(n) = n原创 2017-04-10 21:48:46 · 1378 阅读 · 0 评论 -
二叉树中相距最远的两个节点之间的距离
2015年微软校招面试中的一道题目,在一棵二叉树中,找出相距最远的两个节点之间的距离,函数返回距离值(提示:递归)原创 2015-10-31 20:07:40 · 5045 阅读 · 0 评论 -
大数自增
题目:输入数字n,按顺序打印从1到最大的n位的十进制数,比如输入3,则打印从1,2,3一直到最大的三位数999。解答:本题容易陷入面试官的陷阱,因为如果n非常大,整形或长整型是存不下这个数据的,所以自然应该利用字符串表示大数的方式。大数自增的代码如下,但是打印时应该注意前面有零的情况,要遇到第一个非零开始打印。bool AutoIncrement(char* strNum){原创 2015-10-31 21:51:53 · 545 阅读 · 0 评论 -
链表中的倒数第k个节点
题目:输入一个链表,输出该链表的倒数第k个节点。从1开始计数,即链表的尾节点为倒数第1个节点。解答:首先自然想到的是寻找倒数第k个节点,那么就是从前往后数第n-k+1个节点,则先对链表遍历一遍得到链表的长度,然后第二次遍历时走n-k+1步就可以了。但是该方法需要对链表遍历两次,有没有只需要遍历依次的方法?自然是有的,可以想到用两个指针的方法,先让第一个指针先走k-1步,然后第二个指针指向链表的原创 2015-11-01 14:26:10 · 584 阅读 · 0 评论 -
合并两个有序的链表
题目:输入两个递增排序的链表,合并这两个链表并是新的链表中的节点仍然是按递增排序的。解答:当把链表中较小的节点合并到链表中之后,两个链表剩下的节点依然是有序的,因此合并的步骤和之前的步骤还是一样,终止条件是任意一个链表为空时返回。struct Node{ int m_data; Node* m_pNext; Node(const int data = 0,Node* next = NUL原创 2015-11-01 14:57:09 · 526 阅读 · 0 评论 -
树的子结构
题目:输入两颗树A和B,判断B是不是A的子结构。解答:应该想到递归解决问题。那么递归函数和终止条件是什么呢?首先如果当前的两个节点的值相等,那么递归地判断A中节点的左右子树是否分别包含B中节点的左右子树;如果两个节点的值不相等,那么递归地判断A中节点的左子树是否包含B中节点以及A中节点的右子树是否包含B中节点。(递归函数)然后如果A中节点为空,但B不为空,则返回false;如果B中节点为空,返原创 2015-11-01 16:00:06 · 378 阅读 · 0 评论 -
栈的压入、弹出序列
题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出序列。假设压入栈的所有数字均不相等。解答:利用辅助栈的方式,首先建立两个栈,A栈用来表示栈的压入顺序,B栈表示栈的弹出顺序。将入栈的元素依次压入A栈中直到遇到与B栈栈顶元素相等,同时弹出A,B两栈的栈顶元素。如果入栈元素已全部进入A栈,但是B仍未全部弹出,则该序列不可能为弹出序列。bool IsPopOrder原创 2015-11-02 14:43:46 · 413 阅读 · 0 评论 -
二叉搜索树的后序遍历序列
题目:输入一个整形数组,判断该数组是不是某个二叉搜索树的后序遍历的结果。如果是,则返回true,否则返回false。假设输入的数组任意两个数字会不相同。解答:如果该整形数组是某个二叉搜索树的后序遍历,那么肯定最后一个元素为根节点,该元素可以把数组分成左右两个部分,左子树的元素都小于根节点元素,右子树中的元素都大于根节点的元素,只要右半部分存在比根节点元素小的元素,则返回false,否则分别对左原创 2015-11-02 15:55:20 · 350 阅读 · 0 评论 -
三分法 three-way partitioning
参考:http://blog.jobbole.com/105219/先考虑这样一个问题,给定红、白、蓝三种颜色的小球若干个,将其排成一列,使相同颜色的小球相邻,三种颜色先后顺序为红,白,蓝。这就是经典的 Dutch national flag problem。我们可以针对红,蓝,白三种颜色的球分别计数,然后根据计数结果来重新放球。不过如果我们将问题进一步抽象,也就是说将一个数组转载 2017-11-01 22:43:55 · 5396 阅读 · 0 评论