2011年10月27日
摘要: 转自:http://zhedahht.blog.163.com/blog/static/2541117420079237185699/ 题目:输入一个链表的头结点,从尾到头反过来输出每个结点的值。链表结点定义如下:struct ListNode { int m_nKey; ListNode* m_pNext;}; 分析:这是一道很有意思的面试题。该题以及它的变体经常出现在各大公司的面试、笔试题中。 看到这道题后,第一反应是从头到尾输出比较简单。于是很自然地想到把链表中链接结点的指针反转过来,改变链表的方向。然后就可以从头到尾输出了。反转链表的算法详见本人面试题... 阅读全文
posted @ 2011-10-27 23:39 白草黒尖 阅读(262) 评论(0) 推荐(0)
摘要: 转自:http://zhedahht.blog.163.com/blog/static/2541117420071128950682/ 题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。 分析:这是一道很新颖的关于位运算的面试题。 首先我们考虑这个问题的一个简单版本:一个数组里除了一个数字之外,其他的数字都出现了两次。请写程序找出这个只出现一次的数字。 这个题目的突破口在哪里?题目为什么要强调有一个数字出现一次,其他的出现两次?我们想到了异或运算的性质:任何一个数字异或它自己都等于0。也就是说,如. 阅读全文
posted @ 2011-10-27 22:50 白草黒尖 阅读(204) 评论(0) 推荐(0)
摘要: 转自:http://zhedahht.blog.163.com/blog/static/2541117420094245366965/ 题目:我们把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第1500个丑数。 分析:这是一道在网络上广为流传的面试题,据说google曾经采用过这道题。 所谓一个数m是另一个数n的因子,是指n能被m整除,也就是n % m == 0。根据丑数的定义,丑数只能被2、3和5整除。也就是说如果一个数如果它能被2整除,我们把它连续除以2;如果能被3整除,. 阅读全文
posted @ 2011-10-27 22:12 白草黒尖 阅读(209) 评论(0) 推荐(0)
摘要: 转自:http://zhedahht.blog.163.com/blog/static/2541117420094279426862/ 题目:输入数字n,按顺序输出从1最大的n位10进制数。比如输入3,则输出1、2、3一直到最大的3位数即999。 分析:这是一道很有意思的题目。看起来很简单,其实里面却有不少的玄机。应聘者在解决这个问题的时候,最容易想到的方法是先求出最大的n位数是什么,然后用一个循环从1开始逐个输出。很快,我们就能写出如下代码:// Print numbers from 1 to the maximum number with n digits, in ordervoid P. 阅读全文
posted @ 2011-10-27 19:32 白草黒尖 阅读(1009) 评论(0) 推荐(0)
摘要: 转自:http://zhedahht.blog.163.com/blog/static/25411174200943182411790/ 题目:用递归颠倒一个栈。例如输入栈{1, 2, 3, 4, 5},1在栈顶。颠倒之后的栈为{5, 4, 3, 2, 1},5处在栈顶。 分析:乍一看到这道题目,第一反应是把栈里的所有元素逐一pop出来,放到一个数组里,然后在数组里颠倒所有元素,最后把数组中的所有元素逐一push进入栈。这时栈也就颠倒过来了。颠倒一个数组是一件很容易的事情。不过这种思路需要显示分配一个长度为O(n)的数组,而且也没有充分利用递归的特性。 我们再来考虑怎么递归。我们把栈{1, . 阅读全文
posted @ 2011-10-27 16:50 白草黒尖 阅读(280) 评论(0) 推荐(1)
摘要: 转自:http://zhedahht.blog.163.com/blog/static/25411174200951262930831/ 题目:从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2-10为数字本身,A为1,J为11,Q为12,K为13,而大小王可以看成任意数字。 分析:这题目很有意思,是一个典型的寓教于乐的题目。我们需要把扑克牌的背景抽象成计算机语言。不难想象,我们可以把5张牌看成由5个数字组成的数组。大小王是特殊的数字,不妨把它们都当成0,这样和其他扑克牌代表的数字就不重复了。 接下来我们来分析怎样判断5个数字是不是连续的。最直观的是,我们把数组排序。但值. 阅读全文
posted @ 2011-10-27 16:37 白草黒尖 阅读(502) 评论(0) 推荐(1)
摘要: 转自:http://zhedahht.blog.163.com/blog/static/25411174200952174133707/ 题目:输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个。例如输入数组{32, 321},则输出这两个能排成的最小数字32132。请给出解决问题的算法,并证明该算法。 分析:这是09年6月份百度新鲜出炉的一道面试题,从这道题我们可以看出百度对应聘者在算法方面有很高的要求。 这道题其实是希望我们能找到一个排序规则,根据这个规则排出来的数组能排成一个最小的数字。要确定排序规则,就得比较两个数字,也就是给出两个数字m和n,我们需要确定. 阅读全文
posted @ 2011-10-27 16:16 白草黒尖 阅读(1801) 评论(0) 推荐(0)
摘要: 转自:http://zhedahht.blog.163.com/blog/static/25411174200952765120546/ 题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个排好序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1。 分析:这道题最直观的解法并不难。从头到尾遍历数组一次,就能找出最小的元素,时间复杂度显然是O(N)。但这个思路没有利用输入数组的特性,我们应该能找到更好的解法。 我们注意到旋转之后的数组实际上可以划分为两个排序的子数组,而且前面. 阅读全文
posted @ 2011-10-27 15:59 白草黒尖 阅读(311) 评论(0) 推荐(0)
摘要: 转自:http://zhedahht.blog.163.com/blog/static/254111742009101524946359/ 题目:把n个骰子扔在地上,所有骰子朝上一面的点数之和为S。输入n,打印出S的所有可能的值出现的概率。 分析:玩过麻将的都知道,骰子一共6个面,每个面上都有一个点数,对应的数字是1到 6之间的一个数字。所以,n个骰子的点数和的最小值为n,最大值为6n。因此,一个直观的思路就是定义一个长度为6n-n的数组,和为S的点数出现的次数保存到数组第S-n个元素里。另外,我们还知道n个骰子的所有点数的排列数6^n。一旦我们统计出每一点数出现的次数之后,因此只要把每一点. 阅读全文
posted @ 2011-10-27 15:27 白草黒尖 阅读(1746) 评论(0) 推荐(0)
摘要: 转自:http://zhedahht.blog.163.com/blog/static/254111742009101563242535/ 题目:实现函数double Power(double base, int exponent),求base的exponent次方。不需要考虑溢出。 分析:这是一道看起来很简单的问题。可能有不少的人在看到题目后30秒写出如下的代码:double Power(double base, int exponent){ double result = 1.0; for(int i = 1; i <= exponent; ++i) ... 阅读全文
posted @ 2011-10-27 14:41 白草黒尖 阅读(297) 评论(0) 推荐(0)
摘要: 转自:http://zhedahht.blog.163.com/blog/static/2541117420105146828433/ 题目:设计一个类,我们只能生成该类的一个实例。 分析:只能生成一个实例的类是实现了Singleton模式的类型。 由于设计模式在面向对象程序设计中起着举足轻重的作用,在面试过程中很多公司都喜欢问一些与设计模式相关的问题。在常用的模式中,Singleton是唯一一个能够用短短几十行代码完整实现的模式。因此,写一个Singleton的类型是一个很常见的面试题。 事实上,要让一个类型是能创建一个实例不是一件很难的事情。我们可以把该类型的构造函数设为private,. 阅读全文
posted @ 2011-10-27 13:02 白草黒尖 阅读(291) 评论(0) 推荐(0)