随笔分类 -  03 [100道算法题总结]

[转] 程序员面试题精选100题(35)-找出两个链表的第一个公共结点
摘要:[转] http://hi.baidu.com/evrest/blog/item/bb9365fc7569378ab801a059.html题目:两个单向链表,找出它们的第一个公共结点。链表的结点定义为:struct ListNode{ int m_nKey; ListNode* m_pNext;};分析:这是一道微软的面试题。微软非常喜欢与链表相关的题目,因此在微软的面试题中,链表出现的概率相当高。如果两个单向链表有公共的结点,也就是说两个链表从某一结点开始,它们的m_pNext都指向同一个结点。但由于是单向链表的结点,每个结点只有一个m_pNext,因此从第一个公共结点开始,之后它们所有结 阅读全文
posted @ 2011-02-12 10:38 higirle 阅读(603) 评论(0) 推荐(0)
100道算法题总结
摘要:http://hi.baidu.com/evrest/blog/item/188a120e929ae9ef37d12251.html 阅读全文
posted @ 2011-02-10 15:34 higirle 阅读(757) 评论(0) 推荐(0)
[转] 寻找二叉树中两个节点的最近的公共祖先
摘要:迅雷的笔试可真让人煎熬啊,题量很大,而且考试时间是三个小时。不过迅雷的题目质量很高,既考查了基础知识又不乏高难的数据结构和算法题目。下面和大家分享两道算法编程题,代码没有在编译器上调试,可能会出现一点小bug,感兴趣的朋友可以编译调试一下。题目1:将一个单链表逆转——原来的头指针变为尾指针,原来的尾指针变为头指针。算法思想:从链表的头结点开始依次逆转,最终将整个链表逆转。程序代码:view plaincopy to clipboardprint?/*节点的类定义*/ class Node { Node * next; }; /*链表的类定义*/ cl 阅读全文
posted @ 2011-02-10 14:36 higirle 阅读(857) 评论(0) 推荐(0)
[转] 程序员面试题精选100题(16)-O(logn)求Fibonacci数列
摘要:题目:定义Fibonacci数列如下: /0n=0f(n)= 1n=1 \f(n-1)+f(n-2)n=2输入n,用最快的方法求该数列的第n项。分析:在很多C语言教科书中讲到递归函数的时候,都会用Fibonacci作为例子。因此很多程序员对这道题的递归解法非常熟悉,看到题目就能写出如下的递归求解的代码。///////////////////////////////////////////////////////////////////////// Calculate the nth item of Fibonacci Series recursively/////////////////// 阅读全文
posted @ 2011-02-09 15:49 higirle 阅读(361) 评论(0) 推荐(0)
[转]程序员面试题精选100题(51)-顺时针打印矩阵
摘要:题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。例如:如果输入如下矩阵:1 2 3 45 6 7 89 10 11 1213 14 15 16则依次打印出数字1, 2, 3, 4, 8, 12, 16, 15, 14, 13, 9, 5, 6, 7, 11, 10。分析:第一次看到这个题目的时候,觉得这个题目很简单,完全不需要用到数据结构或者算法的知识,因此没有兴趣做这道题。后来听到包括Autodesk、EMC在内的多家公司在面试或者笔试里采用过这道题,于是想这么多家公司用它来检验一个程序员的编程功底总是有原因的,于是决定自己写一遍试一下。真正写一遍才发现,要完整写出这道题 阅读全文
posted @ 2011-02-09 15:19 higirle 阅读(403) 评论(0) 推荐(0)
(12) 转载:在字符串中删除特定的字符
摘要:题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”。分析:这是一道微软面试题。在微软的常见面试题中,与字符串相关的题目占了很大的一部分,因为写程序操作字符串能很好的反映我们的编程基本功。... 阅读全文
posted @ 2010-11-10 13:56 higirle 阅读(343) 评论(0) 推荐(0)
(16) [转载]:整数的二进制表示中1的个数
摘要:题目:输入一个整数,求该整数的二进制表达中有多少个1。例如输入10,由于其二进制表示为1010,有两个1,因此输出2。分析:这是一道很基本的考查位运算的面试题。包括微软在内的很多公司都曾采用过这道题。一个很基本的想法是,我们先判断整数的最右边一位是不是1。接着把整数右移一位,原来处于右边第二位的数字现在被移到第一位了,再判断是不是1。这样每次移动一位,直到这个整数变成0为止。现在的问题变成怎样判断... 阅读全文
posted @ 2010-11-09 10:17 higirle 阅读(459) 评论(0) 推荐(0)
(19) 转载: 寻找丑数
摘要:题目:我们把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第1500个丑数。 分析:这是一道在网络上广为流传的面试题,据说google曾经采用过这道题。所谓一个数m是另一个数n的因子,是指n能被m整除,也就是n % m == 0。根据丑数的定义,丑数只能被2、3和5整除。也就是说如果... 阅读全文
posted @ 2010-11-09 10:07 higirle 阅读(284) 评论(0) 推荐(0)
(18)[转载]:跳台阶问题
摘要:题目:一个台阶总共有n级,如果一次可以跳1级,也可以跳2级。求总共有多少总跳法,并分析算法的时间复杂度。分析:这道题最近经常出现,包括MicroStrategy等比较重视算法的公司都曾先后选用过个这道题作为面试题或者笔试题。首先我们考虑最简单的情况。如果只有1级台阶,那显然只有一种跳法。如果有2级台阶,那就有两种跳的方法了:一种是分两次跳,每次跳1级;另外一种就是一次跳2级。现在我们再来讨论一般情... 阅读全文
posted @ 2010-11-08 10:54 higirle 阅读(276) 评论(0) 推荐(0)
(2) [转载]:删除链表结点(时间复杂度为O(1)))
摘要:题目:给定链表的头指针和一个结点指针,在O(1)时间删除该结点。链表结点的定义如下:struct ListNode{ int m_nKey; ListNode* m_pNext;};函数的声明如下:void DeleteNode(ListNode* pListHead, ListNode* pToBeDeleted);分析:这是一道广为流传的Google面试题,能有效考察我们的编程基本功,还能考察... 阅读全文
posted @ 2010-11-08 10:37 higirle 阅读(366) 评论(0) 推荐(0)
(9)转载: 字符串的排列
摘要:题目:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。 分析:这是一道很好的考查对递归理解的编程题,因此在过去一年中频繁出现在各大公司的面试、笔试题中。我们以三个字符abc为例来分析一下求字符串排列的过程。首先我们固定第一个字符a,求后面两个字符bc的排列。当两个字符bc的排列求好之... 阅读全文
posted @ 2010-11-05 11:15 higirle 阅读(450) 评论(0) 推荐(0)
(08) [转载]- 在排序数组中查找和为给定值的两个数字
摘要:题目:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。分析:如果我们不考虑时间复杂度,最简单想法的莫过去先在数组中固定一个数字,再依次判断数组中剩下的n-1个数字与它的和是不是等于输入的... 阅读全文
posted @ 2010-11-05 10:47 higirle 阅读(407) 评论(0) 推荐(0)
(3): 求子数组的最大和
摘要:目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。 例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18。分析:本题最初为2005年浙江大学计算机系的考研题的最后一道程序设计题,在2006年里包括g... 阅读全文
posted @ 2010-11-03 18:02 higirle 阅读(499) 评论(4) 推荐(1)
(4): 转载: 查找最小的k个元素
摘要:题目:输入n个整数,输出其中最小的k个。例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。分析:这道题最简单的思路莫过于把输入的n个整数排序,这样排在最前面的k个数就是最小的k个数。只是这种思路的时间复杂度为O(nlogn)。我们试着寻找更快的解决思路。我们可以开辟一个长度为k的数组。每次从输入的n个整数中读入一个数。如果数组中已经插入的元素少于k个,则将读入的整... 阅读全文
posted @ 2010-11-03 17:50 higirle 阅读(340) 评论(0) 推荐(0)
(06) [修正版] 判断整数序列是不是二元查找树的后序遍历结果
摘要:发现网上有很多这道题的解法都是互相拷贝的,都有一些问题,所以本人做了一些更正:代码 Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回true,否则返回false。例如输入5... 阅读全文
posted @ 2010-11-03 17:42 higirle 阅读(455) 评论(0) 推荐(0)
(34)-[转载] 程序员面试题精选100题 -找出数组中两个只出现一次的数字
摘要:题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。分析:这是一道很新颖的关于位运算的面试题。首先我们考虑这个问题的一个简单版本:一个数组里除了一个数字之外,其他的数字都出现了两次。请写程序找出这个只出现一次的数字。这个题目的突破口在哪里?题目为什么要强调有一个数字出现一次,其他的出现两次?我们想到了异或... 阅读全文
posted @ 2010-11-02 13:17 higirle 阅读(588) 评论(0) 推荐(0)