学习笔记之编程之美-微软技术面试心得(一)
书名编程之美-微软技术面试心得 《编程之美》小组 著
从书名就可以知道该书的大体内容了,书中收集约60道算法和程序设计的题目。网上可以找到书中部分章节以及随书源代码,不过我还是喜欢翻书看的感觉。下面是对书中结构之法章节的读书笔记,该节汇集了常见的对字符串、链表、队列,以及树等进行操作的题目。
3.1 字符串移位包含的问题
题目要求判断一字符串能否通过循环移位得到另一字符串。
直观的想法就是循环遍历查找,优化的算法是通过对移位结果规律的发现,得到ABCD做循环移位所得到的字符串都是ABCDABCD字串,从而调用strstr()判断即可。
这题类似于AB数组倒置问题,其中用到(A’B’)’=BA
3.2 电话号码对应英语单词
题目给出手机数字按钮上每个数字对应几个英文字母,要求得到指定数字对应的字母组合。
用二维数组映射数字字母后,可选择循环或者深搜遍历。方法更快的话,就是提前打表存成字典,可以存数字也可以存单词。
3.3 计算字符串的相似度
题目问给定一个字符串通过几步增删改操作能够得到另一给定字符串。
深搜遍历+剪枝。这种给定规则的问题如果规模小,搜索是不用想事的考虑方案。题目给了一个没有优化的代码,其实可以通过预存结果进行判断来剪枝,还可以对相似度大小比较来剪枝,如果当前操作数已经超过已得到的一个相似度结果,那必然是走了弯路,可以剪枝。
3.4 从无头单链表中删除节点
题目给定一个指针指向单链表中某一节点,要求将其自个删除。
链表指针的题目,画图理清思路是关键。此题非主流的删除结点方法很是代表编程之美。
3.5 最短摘要的生成
题目要求对给出的网页文章,生成最短摘要使其包含所有查询关键字。
分词建模后,就转化为字符串匹配问题。直观的想法是循环遍历查找,优化的方法是类似于广搜,用一个首指针一个尾指针维护一个队列,避免重复扫描。
3.6 编程判断两个链表是否相交
题目给出两单链表头指针,要求判断两链表是否相交。
该题算法多样性,挨个节点判断,节点地址HASH判断,两个链表连接到一起判断是否有环,更好的方法是判断尾节点是否相同。
两个扩展问题:1、若链表上有环该怎样判断;2、若要求出第一个相交节点。
3.7 队列中取最大值操作问题
题目给出一队列及其三个操作:加入队列,删除首元素,返回最大元素,要求设计数据结构和算法,让返回最大值操作的时间复杂度尽可能低。
取最大值的方法,一是直接遍历队列;二是维护带索引的最大堆;三是用两个栈模拟队列,同时用一后缀数组从大到小储存值(忘了是不是叫后缀数组了,实际就是数组的值作为下一元素的下标,只要知道首元素的下标就可挨个按序找到所有元素了。例如该题序列{100,50,80}对应的后缀数组是a[0]=2,a[2]=1)。
3.8 求二叉树中节点的最大距离
题目要求得到二叉树中两个最远节点之间有多少条边。
深搜遍历。题末总结了递归问题的套用公式。
3.9 重建二叉树
题目给出前序和中序遍历结果,要求重建这棵树。
数据结构书上的问题。通过前序找到根节点,然后去把中序划分成两个子序列,如此分治递归。
几个扩展问题:1、若节点上字母有重复,判断二叉树是否唯一;2、判断前序遍历和中序遍历的结果是否合理;3、问是否能通过前序遍历和后序遍历重构树。
3.10 分层遍历二叉树
题目给出二叉树,要求从上到下、从左到右遍历二叉树并输出,二打印某层次节点。
广搜遍历。
两个扩展问题:1、从下到上、从左到右访问;2、从下到上、从右到左访问。
3.11 程序改错
题目实际上要求找一段二分查找字符串程序的错误。
程序错误一是midIndex=(minIndex+maxIndex)/2; 在边界值相加中间结果会溢出,应改成midIndex=minIndex+(maxIndex-minIndex)/2; 这个以前还真没考虑过,学习了。
错误二是某些case下程序会陷入死循环。