【php精品源码栏目提醒】:网学会员php精品源码为您提供程序员面试题精选100题 - 招聘面试参考,解决您在程序员面试题精选100题 - 招聘面试学习中工作中的难题,参考学习。
程序员面试题精选 100 题前言 随着高校的持续扩张,每年应届毕业生的数目都在不断增长,伴随而来的是应届毕业生的就业压力也越来越大。
在这样的背景下,就业变成一个买方市场的趋势越来越明显。
为了找到一个称心的工作,绝大多数应届毕业生都必须反复经历简历筛选、电话面试、笔试、面试等环节。
在这些环节中,面试无疑起到最为重要的作用,因为通过面试公司能够最直观的了解学生的能力。
为了有效地准备面试,面经这个新兴概念应运而生。
笔者在当初找工作阶段也从面经中获益匪浅并最终找到满意的工作。
为了方便后来者,笔者花费大量时间收集并整理散落在茫茫网络中的面经。
不同行业的面经全然不同,笔者从自身专业出发,着重关注程序员面试的 , ,面经 并从精选出若干具有代表性的技术类的面试题展开讨论 希望能给读者带来一些启发。
由于笔者水平有限,给各面试题提供的思路和代码难免会有错误,还请读者批评指正。
另外,热忱欢迎读者能够提供更多、更好的面试题,本人将感激不尽。
01把二元查找树转变成排序的双向链表 题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
比如将二元查找树 10 / 6 14 / / 4 8 12 16转换成双向链表46810121416。
分析:本题是微软的面试题。
很多与树相关的题目都是用递归的思路来解决,本题也不例外。
下面我们用两种不同的递归思路来分析。
思路一:当我们到达某一结点准备调整以该结点为根结点的子树时,先调整其左子树将左子树转换成一个排好序的左子链表,再调整其右子树转换右子链表。
最近链接左子链表的最右结点(左子树的最大结点)、当前结点和右子链表的最左结点(右子树的最小结点)。
从树的根结点开始递归调整所有结点。
思路二:我们可以中序遍历整棵树。
按照这个方式遍历树,比较小的结点先访问。
如果我们每访问一个结点,假设之前访问过的结点已经调整成一个排序双向链表,我们再把调整当前结点的指针将其链接到链表的末尾。
当所有结点都访问过之后,整棵树也就转换成一个排序双向链表了。
参考代码:首先我们定义二元查找树结点的数据结构如下: struct BSTreeNode // a node in the binary search tree int m_nValue // value of node BSTreeNode m_pLeft // left child of node BSTreeNode m_pRight // right child of node 思路一对应的代码:///////////////////////////////////////////////////////////////////////// Covert a sub binary-search-tree into a sorted double-linked list// Input: pNode - the head of the sub tree// asRight - whether pNode is the right child of its parent// Output: if asRight is true return the least node in the sub-tree// else return the greatest node in the sub-tree///////////////////////////////////////////////////////////////////////BSTreeNode ConvertNodeBSTreeNode pNode bool asRight ifpNode return NULL BSTreeNode pLeft NULL BSTreeNode pRight NULL // Convert the left sub-tree ifpNode-gtm_pLeft pLeft ConvertNodepNode-gtm_pLeft false // Connect the greatest node in the left sub-tree to the current node ifpLeft pLeft-gtm_pRight pNode pNode-gtm_pLeft pLeft // Convert the right sub-tree ifpNode-gtm_pRight pRight ConvertNodepNode-gtm_pRight true // Connect the least node in the right sub-tree to the current node ifpRight pNode-gtm_pRight pRight pRight-gtm_pLeft pNode BSTreeNode pTemp pNode // If the current node is the right child of its parent // return the least node in the tree whose root is the current node ifasRight whilepTemp-gtm_pLeft pTemp pTemp-gtm_pLeft // If the current node is the left child of its parent // return the greatest node in the tree whose root is the current node else whilepTemp-gtm_pRight pTemp pTemp-gtm_pRight return pTemp///////////////////////////////////////////////////////////////////////// Covert a binary search tree into a sorted double-linked list// Input: the head of tree// Output: the head of sorted double-linked list///////////////////////////////////////////////////////////////////////BSTreeNode ConvertBSTreeNode pHeadOfTree // As we want to return the head of the sorted double-linked list // we set the second parameter to be true return ConvertNodepHeadOfTree true思路二对应的代码:///////////////////////////////////////////////////////////////////////// Covert a sub binary-search-tree into a sorted double-linked list// Input: pNode - the head of the sub tree// pLastNodeInList - the tail of the double-linked list///////////////////////////////////////////////////////////////////////void ConvertNodeBSTreeNode pNode BSTreeNodeamp pLastNodeInList ifpNode NULL return BSTreeNode pCurrent pNode // Convert the left sub-tree if pCurrent-gtm_pLeft NULL ConvertNodepCurrent-gtm_pLeft pLastNodeInList // Put the current node into the double-linked list pCurrent-gtm_pLeft pLastNodeInList ifpLastNodeInList NULL pLastNodeInList-gtm_pRight pCurrent pLastNodeInList pCurrent // Convert the right sub-tree if pCurrent-gtm_pRight NULL ConvertNodepCurrent-gtm_pRight pLastNodeInList///////////////////////////////////////////////////////////////////////// Covert a binary search tree into a sorted double-linked list// Input: pHeadOfTree - the head of tree// Output: the head of sorted double-linked list///////////////////////////////////////////////////////////////////////BSTreeNode Convert_Solution1BSTreeNode pHeadOfTree BSTreeNode pLastNodeInList NULL ConvertNodepHeadOfTree pLastNodeInList // Get the head of the double-linked list BSTreeNode pHeadOfList pLastNodeInList whilepHeadOfList ampamp pHeadOfList-gtm_pLeft pHeadOfList pHeadOfList-gtm_pLeft return pHeadOfList02设计包含 min 函数的栈题目:定义栈的数据结构,要求添加一个 min 函数,能够得到栈的最小元素。
要求函数 min、push 以及 pop 的时间复杂度都是 O1。
分析:这是去年 google 的一道面试题。
我看到这道题目时,第一反应就是每次 push 一个新元素时,将栈里所有逆序元素排序。
这样栈顶元素将是最小元素。
但由于不能保证最后 push 进栈的元素最先出栈,这种思路设计的数据结构已经不是一个栈了。
在栈里添加一个成员变量存放最小元素(或最小元素的位置)。
每次 push 一个新元素进栈的时候,如果该元素比当前的最小元素还要小,则更新最小元素。
乍一看这样思路挺好的。
但仔细一想,该思路存在一个
上一篇:
基于PHP的教学网站
下一篇:
酒瓶内盖塑料模具设计