ImageVerifierCode 换一换
格式:DOC , 页数:96 ,大小:456.50KB ,
资源ID:7770131      下载积分:10 金币
验证码下载
登录下载
邮箱/手机:
验证码: 获取验证码
温馨提示:
支付成功后,系统会自动生成账号(用户名为邮箱或者手机号,密码是验证码),方便下次登录下载和查询订单;
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/7770131.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  
声明  |  会员权益     获赠5币     写作写作

1、填表:    下载求助     留言反馈    退款申请
2、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
3、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
4、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
5、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【pc****0】。
6、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
7、本文档遇到问题,请及时私信或留言给本站上传会员【pc****0】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。

注意事项

本文(程序员面试题100题.doc)为本站上传会员【pc****0】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4008-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

程序员面试题100题.doc

1、程序员面试题精选100题(01)把二元查找树转变成排序的双向链表题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。比如将二元查找树 10 / 6 14 / / 4 8 12 16转换成双向链表4=6=8=10=12=14=16。分析:本题是微软的面试题。很多与树相关的题目都是用递归的思路来解决,本题也不例外。下面我们用两种不同的递归思路来分析。思路一:当我们到达某一结点准备调整以该结点为根结点的子树时,先调整其左子树将左子树转换成一个排好序的左子链表,再调整其右子树转换右子链表。最近链接左子链表的最右结点(左子树的最大结点)、当前结点

2、和右子链表的最左结点(右子树的最小结点)。从树的根结点开始递归调整所有结点。思路二:我们可以中序遍历整棵树。按照这个方式遍历树,比较小的结点先访问。如果我们每访问一个结点,假设之前访问过的结点已经调整成一个排序双向链表,我们再把调整当前结点的指针将其链接到链表的末尾。当所有结点都访问过之后,整棵树也就转换成一个排序双向链表了。参考代码:首先我们定义二元查找树结点的数据结构如下: struct BSTreeNode / a node in the binary search tree int m_nValue; / value of nodeBSTreeNode *m_pLeft; / left

3、 child of nodeBSTreeNode *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

4、/ else return the greatest node in the sub-tree/BSTreeNode* ConvertNode(BSTreeNode* pNode, bool asRight)if(!pNode)return NULL;BSTreeNode *pLeft = NULL;BSTreeNode *pRight = NULL;/ Convert the left sub-treeif(pNode-m_pLeft)pLeft = ConvertNode(pNode-m_pLeft, false);/ Connect the greatest node in the le

5、ft sub-tree to the current nodeif(pLeft)pLeft-m_pRight = pNode;pNode-m_pLeft = pLeft;/ Convert the right sub-treeif(pNode-m_pRight)pRight = ConvertNode(pNode-m_pRight, true);/ Connect the least node in the right sub-tree to the current nodeif(pRight)pNode-m_pRight = pRight;pRight-m_pLeft = pNode;BST

6、reeNode *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 nodeif(asRight)while(pTemp-m_pLeft)pTemp = pTemp-m_pLeft;/ If the current node is the left child of its parent,/ return the greatest node in the tree whose root

7、 is the current nodeelsewhile(pTemp-m_pRight)pTemp = pTemp-m_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* Convert(BSTreeNode* pHeadOfTree)/ As we want to return the head of the s

8、orted double-linked list,/ we set the second parameter to be truereturn ConvertNode(pHeadOfTree, 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 ConvertNode(BSTreeNod

9、e* pNode, BSTreeNode*& pLastNodeInList)if(pNode = NULL)return;BSTreeNode *pCurrent = pNode;/ Convert the left sub-treeif (pCurrent-m_pLeft != NULL)ConvertNode(pCurrent-m_pLeft, pLastNodeInList);/ Put the current node into the double-linked listpCurrent-m_pLeft = pLastNodeInList;if(pLastNodeInList !=

10、 NULL)pLastNodeInList-m_pRight = pCurrent;pLastNodeInList = pCurrent;/ Convert the right sub-treeif (pCurrent-m_pRight != NULL)ConvertNode(pCurrent-m_pRight, pLastNodeInList);/ Covert a binary search tree into a sorted double-linked list/ Input: pHeadOfTree - the head of tree/ Output: the head of so

11、rted double-linked list/BSTreeNode* Convert_Solution1(BSTreeNode* pHeadOfTree)BSTreeNode *pLastNodeInList = NULL;ConvertNode(pHeadOfTree, pLastNodeInList);/ Get the head of the double-linked listBSTreeNode *pHeadOfList = pLastNodeInList;while(pHeadOfList & pHeadOfList-m_pLeft)pHeadOfList = pHeadOfLi

12、st-m_pLeft;return pHeadOfList;程序员面试题精选100题(02)设计包含min函数的栈题目:定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。 分析:这是去年google的一道面试题。我看到这道题目时,第一反应就是每次push一个新元素时,将栈里所有逆序元素排序。这样栈顶元素将是最小元素。但由于不能保证最后push进栈的元素最先出栈,这种思路设计的数据结构已经不是一个栈了。在栈里添加一个成员变量存放最小元素(或最小元素的位置)。每次push一个新元素进栈的时候,如果该元素比当前的最小元素还要小

13、,则更新最小元素。乍一看这样思路挺好的。但仔细一想,该思路存在一个重要的问题:如果当前最小元素被pop出去,如何才能得到下一个最小元素?因此仅仅只添加一个成员变量存放最小元素(或最小元素的位置)是不够的。我们需要一个辅助栈。每次push一个新元素的时候,同时将最小元素(或最小元素的位置。考虑到栈元素的类型可能是复杂的数据结构,用最小元素的位置将能减少空间消耗)push到辅助栈中;每次pop一个元素出栈的时候,同时pop辅助栈。参考代码:#include #include template class CStackWithMinpublic:CStackWithMin(void) virtual

14、 CStackWithMin(void) T& top(void);const T& top(void) const;void push(const T& value);void pop(void);const T& min(void) const;private:Tm_data;/ theelements of stacksize_tm_minIndex;/ the indicesof minimum elements;/ get the last element of mutable stacktemplate T& CStackWithMin:top()return m_data.bac

15、k();/ get the last element of non-mutable stacktemplate const T& CStackWithMin:top() constreturn m_data.back();/ insert an elment at the end of stacktemplate void CStackWithMin:push(const T& value)/ append the data into the end of m_datam_data.push_back(value);/ set the index of minimum elment in m_

16、data at the end of m_minIndexif(m_minIndex.size() = 0)m_minIndex.push_back(0);elseif(value m_datam_minIndex.back()m_minIndex.push_back(m_data.size() - 1);elsem_minIndex.push_back(m_minIndex.back();/ erease the element at the end of stacktemplate void CStackWithMin:pop()/ pop m_datam_data.pop_back();

17、/ pop m_minIndexm_minIndex.pop_back();/ get the minimum element of stacktemplate const T& CStackWithMin:min() constassert(m_data.size() 0);assert(m_minIndex.size() 0);return m_datam_minIndex.back();举个例子演示上述代码的运行过程: 步骤 数据栈 辅助栈 最小值1.push 3 3 0 32.push 4 3,4 0,0 33.push 2 3,4,2 0,0,2 24.push 1 3,4,2,1

18、0,0,2,3 15.pop 3,4,2 0,0,2 26.pop 3,4 0,0 37.push 0 3,4,0 0,0,2 0讨论:如果思路正确,编写上述代码不是一件很难的事情。但如果能注意一些细节无疑能在面试中加分。比如我在上面的代码中做了如下的工作: 用模板类实现。如果别人的元素类型只是int类型,模板将能给面试官带来好印象; 两个版本的top函数。在很多类中,都需要提供const和非const版本的成员访问函数; min函数中assert。把代码写的尽量安全是每个软件公司对程序员的要求; 添加一些注释。注释既能提高代码的可读性,又能增加代码量,何乐而不为?总之,在面试时如果时间允许,

19、尽量把代码写的漂亮一些。说不定代码中的几个小亮点就能让自己轻松拿到心仪的Offer。PS:每当push进一个新元素,若比当前最小元素小,则将它进栈,并将它的index进最小辅助栈;若大于当前最小元素,则将它进栈,并将当前最小元素index进最小辅助栈(可以重复进栈多次)!程序员面试题精选100题(03)求子数组的最大和题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,

20、因此输出为该子数组的和18。分析:本题最初为2005年浙江大学计算机系的考研题的最后一道程序设计题,在2006年里包括google在内的很多知名公司都把本题当作面试题。由于本题在网络中广为流传,本题也顺利成为2006年程序员面试题中经典中的经典。如果不考虑时间复杂度,我们可以枚举出所有子数组并求出他们的和。不过非常遗憾的是,由于长度为n的数组有O(n2)个子数组;而且求一个长度为n的数组的和的时间复杂度为O(n)。因此这种思路的时间是O(n3)。很容易理解,当我们加上一个正数时,和会增加;当我们加上一个负数时,和会减少。如果当前得到的和是个负数,那么这个和在接下来的累加中应该抛弃并重新清零,不

21、然的话这个负数将会减少接下来的和。基于这样的思路,我们可以写出如下代码。参考代码:/ Find the greatest sum of all sub-arrays/ Return value: if the input is valid, return true, otherwise return false/bool FindGreatestSumOfSubArray(int *pData, / an arrayunsigned int nLength, / the length of arrayint &nGreatestSum / the greatest sum of all sub

22、-arrays)/ if the input is invalid, return falseif(pData = NULL) | (nLength = 0)return false;int nCurSum = nGreatestSum = 0;for(unsigned int i = 0; i nLength; +i)nCurSum += pDatai;/ if the current sum is negative, discard itif(nCurSum nGreatestSum)nGreatestSum = nCurSum;/ if all data are negative, fi

23、nd the greatest element in the arrayif(nGreatestSum = 0)nGreatestSum = pData0;for(unsigned int i = 1; i nGreatestSum)nGreatestSum = pDatai;return true;讨论:上述代码中有两点值得和大家讨论一下: 函数的返回值不是子数组和的最大值,而是一个判断输入是否有效的标志。如果函数返回值的是子数组和的最大值,那么当输入一个空指针是应该返回什么呢?返回0?那这个函数的用户怎么区分输入无效和子数组和的最大值刚好是0这两中情况呢?基于这个考虑,本人认为把子数组和的

24、最大值以引用的方式放到参数列表中,同时让函数返回一个函数是否正常执行的标志。 输入有一类特殊情况需要特殊处理。当输入数组中所有整数都是负数时,子数组和的最大值就是数组中的最大元素。编程珠机第八章,8.4扫描算法。采用类似分治算法的道理:前i个元素中,最大综合子数组要么在i-1个元素中(maxsofar),要么截止到位置i(maxendinghere)。程序员面试题精选100题(04)在二元树中找出和为某一值的所有路径题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。例如输入整数22和如下二元树 10 / 5 12

25、 / 4 7 则打印出两条路径:10, 12和10, 5, 7。二元树结点的数据结构定义为:struct BinaryTreeNode / a node in the binary treeint m_nValue; / value of nodeBinaryTreeNode *m_pLeft; / left child of nodeBinaryTreeNode *m_pRight; / right child of node;分析:这是百度的一道笔试题,考查对树这种基本数据结构以及递归函数的理解。当访问到某一结点时,把该结点添加到路径上,并累加当前结点的值。如果当前结点为叶结点并且当前路径

26、的和刚好等于输入的整数,则当前的路径符合要求,我们把它打印出来。如果当前结点不是叶结点,则继续访问它的子结点。当前结点访问结束后,递归函数将自动回到父结点。因此我们在函数退出之前要在路径上删除当前结点并减去当前结点的值,以确保返回父结点时路径刚好是根结点到父结点的路径。我们不难看出保存路径的数据结构实际上是一个栈结构,因为路径要与递归调用状态一致,而递归调用本质就是一个压栈和出栈的过程。参考代码:/ Find paths whose sum equal to expected sum/void FindPath(BinaryTreeNode* pTreeNode, / a node of bi

27、nary treeint expectedSum, / the expected sumstd:vector&path, / a pathfrom root to current nodeint& currentSum / the sum of path)if(!pTreeNode)return;currentSum += pTreeNode-m_nValue;path.push_back(pTreeNode-m_nValue);/ if the node is a leaf, and the sum is same as pre-defined,/ the path is what we w

28、ant. print the pathbool isLeaf = (!pTreeNode-m_pLeft & !pTreeNode-m_pRight);if(currentSum = expectedSum & isLeaf)std:vector:iterator iter =path.begin();for(; iter != path.end(); + iter)std:cout*itert;std:coutm_pLeft)FindPath(pTreeNode-m_pLeft, expectedSum, path, currentSum);if(pTreeNode-m_pRight)Fin

29、dPath(pTreeNode-m_pRight, expectedSum, path, currentSum);/ when we finish visiting a node and return to its parent node,/ we should delete this node from the path and/ minus the nodes value from the current sumcurrentSum -= pTreeNode-m_nValue;path.pop_back();程序员面试题精选100题(05)查找最小的k个元素题目:输入n个整数,输出其中最小

30、的k个。例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。分析:这道题最简单的思路莫过于把输入的n个整数排序,这样排在最前面的k个数就是最小的k个数。只是这种思路的时间复杂度为O(nlogn)。我们试着寻找更快的解决思路。我们可以开辟一个长度为k的数组。每次从输入的n个整数中读入一个数。如果数组中已经插入的元素少于k个,则将读入的整数直接放到数组中。否则长度为k的数组已经满了,不能再往数组里插入元素,只能替换了。如果读入的这个整数比数组中已有k个整数的最大值要小,则用读入的这个整数替换这个最大值;如果读入的整数比数组中已有k个整数的最大值还要大,则读入的这个整

31、数不可能是最小的k个整数之一,抛弃这个整数。这种思路相当于只要排序k个整数,因此时间复杂可以降到O(n+nlogk)。通常情况下k要远小于n,所以这种办法要优于前面的思路。这是我能够想出来的最快的解决方案。不过从给面试官留下更好印象的角度出发,我们可以进一步把代码写得更漂亮一些。从上面的分析,当长度为k的数组已经满了之后,如果需要替换,每次替换的都是数组中的最大值。在常用的数据结构中,能够在O(1)时间里得到最大值的数据结构为最大堆。因此我们可以用堆(heap)来代替数组。另外,自己重头开始写一个最大堆需要一定量的代码。我们现在不需要重新去发明车轮,因为前人早就发明出来了。同样,STL中的se

32、t和multiset为我们做了很好的堆的实现,我们可以拿过来用。既偷了懒,又给面试官留下熟悉STL的好印象,何乐而不为之?参考代码:#include #include #include using namespace std;typedef multisetint, greater IntHeap;/ find k least numbers in a vector/void FindKLeastNumbers(const vector& data, / a vector of dataIntHeap& leastNumbers, / k least numbers, outputunsign

33、ed int k )leastNumbers.clear();if(k = 0 | data.size() k)return;vector:const_iterator iter = data.begin();for(; iter != data.end(); + iter)/ if less than k numbers was inserted into leastNumbersif(leastNumbers.size() k)leastNumbers.insert(*iter);/ leastNumbers contains k numbers and its full nowelse/

34、 first number in leastNumbers is the greatest oneIntHeap:iterator iterFirst = leastNumbers.begin();/ if is less than the previous greatest numberif(*iter *(leastNumbers.begin()/ replace the previous greatest numberleastNumbers.erase(iterFirst);leastNumbers.insert(*iter);程序员面试题精选100题(06)判断整数序列是不是二元查找

35、树的后序遍历结果题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回true,否则返回false。 例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果: 8 / 6 10 / / 5 7 9 11因此返回true。如果输入7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,因此返回false。分析:这是一道trilogy的笔试题,主要考查对二元查找树的理解。在后续遍历得到的序列中,最后一个元素为树的根结点。从头开始扫描这个序列,比根结点小的元素都应该位于序列的左半部分;从第一个大于跟结点开始到跟结点前面的一个元素为止,所有元素都应该大于

36、跟结点,因为这部分元素对应的是树的右子树。根据这样的划分,把序列划分为左右两部分,我们递归地确认序列的左、右两部分是不是都是二元查找树。参考代码:using namespace std;/ Verify whether a squence of integers are the post order traversal/ of a binary search tree (BST)/ Input: squence - the squence of integers/ length - the length of squence/ Return: return ture if the squenc

37、e is traversal result of a BST,/ otherwise, return false/bool verifySquenceOfBST(int squence, int length)if(squence = NULL | length = 0)return false;/ root of a BST is at the end of post order traversal squenceint root = squencelength - 1;/ the nodes in left sub-tree are less than the rootint i = 0;for(; i

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服