php面试题题求解

您现在的位置:&&>&&>&&>&&>&正文
HR的刁钻面试题该如何回答?
来源:  17:37:52 【】 
  面试为什么重要?经常我们会提到面试成本的问题,一位求职者在求职的最初,需要花费大量时间和精力,用在撰写简历、通过网络/报纸等途径挑选适合他的工作、投递简历并做记录这些准备工作上。如果他有幸获得一个面试机会,这些成本就会成为二选一赌局的砝码,若面试成功,他的投入将获得回报,但若面试失败,则意味着之前的付出归零,他不得不从头来过。钢铁人才网提醒大家:求职中语言的交流技巧会直接影响最终面试结果,得体简练但又重点突出的回答会为整个面试加分不少。我们都不希望自己的成本被白白投入水中,因此,面试前准备工作的非常重要,下面就来看看HR最刁钻的面试问题是什么?
  刁钻面试问题一:你和上司因为工作有过分歧吗?最后的结果是?
  问题分析:“企业潜规则”是一个流行词,其中重要的一部分就是“等级制度”,企业是一座等级森严的堡垒,如果你还没有意识到其中的残酷性,这个问题恐怕就会让你栽跟头,如果你的回答表现出对上司权力的挑衅,那么对不起,哪座庙都装不下你这尊大佛。其实这个问题并不难,你只要明白,上司是承担责任的那一个,所以他才是下决定的那一个。不要表现得好像青春期反抗父母权威的叛逆小孩,这并不能体现你的个性,只是让别人知道你还不成熟。
  回答思路:必须遵从的原则:1.表示一定会选择适当的时机与上司沟通,其中“适当的时机”非常重要;2.表示通常情况下最终一定服从上司的决定,但不要使用“你是上司你说了算”这种表达方式。3.不要打“越级报告”的主意,这在任何企业都是禁忌。
  刁钻面试问题二:你的缺点是什么?
  问题分析:你真正的缺点是什么并不重要,面试者希望了解的是求职者是否对自己有一个正确的评价,对自己是否有足够的了解,心理是否足够成熟,以及是否有继续学习改进的愿望。当然,通常面试官不会把问题问得那么直接,而是通过让面试者举出具体事例的方式来回答,求职者难以临场编造一个具体的例子,因而答案更具真实性。但如果你诚实地交代了“我因为过于内向而放弃了销售机会”的故事,那同样等于你放弃了这个新的工作机会。
  回答思路:这个问题根据面试者的不同,面试官也会对答案有不同的心理预期。比如说一个应届毕业生,就可以直接回答:“我相信我有足够的理论知识和专业能力,但是我的工作和社会经验不足,人脉也有所欠缺……”这样答案符合面试官对毕业生身份的定位,也符合实际情况,面试官便会觉得你谦虚诚实;而如果一个女性应聘管理岗位,则可以回答:“我最大的缺点可能就是不像女人,不够温柔……”总之,一切回答取决于你的实际状况和你对自己的定位。
  刁钻面试问题三:你的期望薪资是多少?
  问题分析:恭喜,如果被询问这个问题,说明你被录用的可能很大。在回答之前应该明白的是,其实每一个公司都有自己的薪酬体系,如果不是空降BOSS或者特别顾问,你不可能就薪酬问题有太多讨价还价的余地。这个问题背后没有隐含的意义,只要你对自己和本岗位估价正确即可。
  回答思路:不能狮子大开口,想要获得比较公平的薪酬,有两种方法:一,在面试前进行市场调查,了解一下本行业本岗位的平均薪酬水平;二,如果这个数字比较难获得,那么可以以之前的工作收入为基准,适当地进行提升。需要注意的是,不要在没有依据铺垫的前提下直接说“我想要月薪多少”,也不要主动询问薪酬。
  刁钻面试问题四:是否有过失败的经历?
  问题分析:既然提问的是“失败经历”,说明面试官在意的并不是这个结果,他想了解的是事情的过程、你处理工作的方法以及你的学习能力。通常“你工作中最难忘的一件事”“你在工作中遇到的最大困难”都可以等同于这个问题。在回答上,答案的具体事例也可以体现应聘者的专业程度,比如提到的困难是不是应聘岗位所不可避免的,所涉及的方法和使用的公司资源又是否恰当,这是一个非常专业的问题。
  回答思路:回答的重点应该在“经历”,而非“失败”上,面试官并不想了解你对失败的态度--任何人都知道此时应该保持积极。回答时应该具体说明的内容有:1.当时的背景和能够使用的资源;2.你处理事情的方法;3.失败后的总结和反思。细节越详细越可以体现你的专业程度,总结和反思则体现了你的学习能力。有自信有准备的话,可以就失败的经历“重来一次”,提出新的解决方案。1&&&
文章责编:gaoxiaoliang& 看了本文的网友还看了
?&&()?&&()?&&()?&&()?&&()?&&()
12345678910
12345678910
12345678910
12345678910
12345678910
12345678910
? ?   ? ?   ? ?   ? ?   ? ?
? ?   ? ?   ?
?   ? ?    ? ?   ? ?   ? ?   ? ?
? ?   ? ?
实用工具 |
| 大全 | 大全
     |
版权声明:如果网所转载内容不慎侵犯了您的权益,请与我们联系,我们将会及时处理。如转载本内容,请注明出处。
Copyright & 2004-
 网 All Rights Reserved 
中国科学院研究生院权威支持(北京) 电 话:010- 传 真:010-2015年9月 VC/MFC大版内专家分月排行榜第二2015年7月 硬件/嵌入开发大版内专家分月排行榜第二2014年5月 VC/MFC大版内专家分月排行榜第二2014年3月 VC/MFC大版内专家分月排行榜第二2013年10月 VB大版内专家分月排行榜第二2013年7月 VB大版内专家分月排行榜第二2012年5月 VB大版内专家分月排行榜第二2012年4月 VB大版内专家分月排行榜第二2012年2月 VB大版内专家分月排行榜第二2011年11月 VB大版内专家分月排行榜第二
2015年11月 VC/MFC大版内专家分月排行榜第三2015年6月 VC/MFC大版内专家分月排行榜第三2015年2月 VC/MFC大版内专家分月排行榜第三2014年1月 VC/MFC大版内专家分月排行榜第三2012年3月 VB大版内专家分月排行榜第三2011年12月 VB大版内专家分月排行榜第三2011年10月 VB大版内专家分月排行榜第三
2014年10月 C/C++大版内专家分月排行榜第三2014年4月 C/C++大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
第一题:给定一个字符串,请你将字符串重新编码,将连续的字符替换成“连续出现的个数+字符”。比如字符串AAAABCCDAA会被编码成4A1B2C1D2A。
第二题:在一个N*N的数组中寻找所有横,竖,左上到右下,右上到左下,四种方向的直线连续D个数字的和里面最大的值输入描述:每个测试输入包含1个测试用例,第一行包括两个整数 N 和 D :3 &= N &= 1001 &= D &= N接下来有N行,每行N个数字d:0 &= d &= 100
输出描述:输出一个整数,表示找到的和的最大值
输入例子:4 287 98 79 6110 27 95 7020 64 73 2971 65 15 0
输出例子:193
第三题:大家一定玩过“推箱子”这个经典的游戏。具体规则就是在一个N*M的地图上,有1个玩家、1个箱子、1个目的地以及若干障碍,其余是空地。玩家可以往上下左右4个方向移动,但是不能移动出地图或者移动到障碍里去。如果往这个方向移动推到了箱子,箱子也会按这个方向移动一格,当然,箱子也不能被推出地图或推到障碍里。当箱子被推到目的地以后,游戏目标达成。现在告诉你游戏开始是初始的地图布局,请你求出玩家最少需要移动多少步才能够将游戏目标达成。 输入描述:每个测试输入包含1个测试用例第一行输入两个数字N,M表示地图的大小。其中0&N,M&=8。接下来有N行,每行包含M个字符表示该行地图。其中 . 表示空地、X表示玩家、*表示箱子、#表示障碍、@表示目的地。每个地图必定包含1个玩家、1个箱子、1个目的地。
输出描述:输出一个数字表示玩家最少需要移动多少步才能将游戏目标达成。当无论如何达成不了的时候,输出-1。
输入例子:4 4......*@.....X..6 6...#........
..##.#..X....@#...
输出例子:311
第四题:在一条无限长的跑道上,有N匹马在不同的位置上出发开始赛马。当开始赛马比赛后,所有的马开始以自己的速度一直匀速前进。每匹马的速度都不一样,且全部是同样的均匀随机分布。在比赛中当某匹马追上了前面的某匹马时,被追上的马就出局。 请问按以上的规则比赛无限长的时间后,赛道上剩余的马匹数量的数学期望是多少 输入描述:每个测试输入包含1个测试用例输入只有一行,一个正整数N1 &= N &= 1000
输出描述:输出一个浮点数,精确到小数点后四位数字,表示剩余马匹数量的数学期望
输入例子:12
输出例子:1.00001.5000
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
感觉不难 可是自己偏偏不会。。。
该答案已被忽略,原因:不符合答题规范,内容不是答案,可用评论、投票替代
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
var key = "AAAABCCDAA";
var result = "";
var lastKey = "", lastKeyCount = 0, currentK
for(var i = 0; i & key. i++ ){
currentKey = key.substr(i,1);
if( currentKey == lastKey ){
lastKeyCount++;
if( lastKey != ""){
result += lastKeyCount + lastK
lastKey = currentK
lastKeyCount = 1;
//最后补全
result += lastKeyCount + lastK
console.log(result);
第一题(正则解法):
var key = "AAAABCCDAA";
var result = "";
var currentKey, keyCount, tempA
for( var i = 0 ; i & key. i++ ){
currentKey = key.substr(i, 1);
tempArr = (new RegExp('^' + currentKey + '+')).exec( key.substr(i) );
result += tempArr[0].length + currentK
i += tempArr[0].length - 1;
console.log(result);
第一题(终极解法):受
的启发,写完后 和
撞车了,思路一样,只是正则不一样。
var key = "AAAABCCDAA";
var result = key.replace(/(\w)\1*/ig, function($1, $2){return $1.length + $2;})
console.log(result);
分享到微博?
你好!看起来你挺喜欢这个内容,但是你还没有注册帐号。 当你创建了帐号,我们能准确地追踪你关注的问题,在有新答案或内容的时候收到网页和邮件通知。还能直接向作者咨询更多细节。如果上面的内容有帮助,记得点赞 (????)? 表示感谢。
明天提醒我
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:部分面试题解题思路
我的图书馆
部分面试题解题思路
这几天在网上看到一篇关于算法面试题的博客,归纳的很好,有不少经典的题目,大部分来自《编程珠玑》、《编程之美》、《代码之美》三本书。这里给出书上的解答以及一些思考。如有不对的地方,希望得到高手的指点。
【一】 时间受限
大部分的面试题,都是对时间复杂度有所要求的,如果有涉及,“最快”一类的字样,毫无疑问,先上时空原理,用空间来换时间。Hash,大数组,一些辅助性
的空间,都是首选。在我的面试经历中,有无数次用到过Hash和大数组的。不过,通常这不会是面试官想听的唯一解法,他们紧接着十有八九是会说“如果只有
xxxx空间呢?”。说此类方法只是为自己争取更多的时间,并且体现思考的完整性,简而言之,装B用。。。
eg1.1:求一个char(8bit)中,二进制1的个数,越快越好。
-- 《编程之美》
编程之美上提供了五种方法,(1)使用除法操作
(2)使用位操作 (3)在位操作的基础上改进,算法的复杂度只于1的个数有关 (4)使用分支操作 (5)查表法。
第2种方法用的是位运算,比第一种方法高效很多。第3种方法非常有技巧。第4,5两种方法其实是用空间换时间,但是如果是一个int(32bit),那么这两种方法就不适用了。方法3的代码
Count(BYTE v)&{&
& int num = 0;&
& while( v )&{
& & & & v &= ( v - 1 );
& & & & num++;
eg1.2:有一个整数数组A[N],让你不用除法,求另一个数组B[N],其中B[i]
= A[0]*A[1] ... * A[N-1] / A[i],期望复杂度是O(N)。&--
TopLanguage&
利用两个辅助数组C[N],D[N]完成,其中C[i]
= A[0]*A[1]*...A[i-1]*A[i], D[i]=A[i]*A[i+1]*...A[N-2]*A[N-1],B[i] =C[i-1] *D[i+1]&
【二】 空间受限
这里的空间受限,指的是在大数据分析的逻辑下,空间受限的问题。大部分情况下,就是压缩。位图是一个很好的方法,用一个bit(或几个)取代更大的int类型,最常见的位图是1bit
取代 1int,其实,很多时候,1bit可以取代更大的空间,这完全取决于你需要保留的信息。。。
&eg2.1:有一个很大的文件,存放一堆7位的电话号码,号码无重复,请用最小的内存消耗,将其排序。
-- 《编程珠玑》
利用位图技术实现。每一个号码如果用一个int存储,那么需要40MB ( &(10^7*4)/10^6 MB),如果用位图技术,则只需用1位来存放1个号码,需要1.25MB( &( 10^7/8)/10^6
每个号码对应位图的一位,位图初始全清零,读入一个号码就把相应的位置位,遍历后按位图顺序输出对应的数字。
eg2.2:给10MB的内存,给一个4百万整数的文件,找一个不在文件中的整数。
可以用10MB内存来存放
0 到(8*10^7-1)范围数的出现情况。扫描文件一遍,将该范围中相应的位置位,超出范围的数简单丢弃。然后遍历位图,找到第一个为0的位即可,位图中肯定有未置位的位。
:给10MB的内存,给一个40亿整数的文件,找一个不在文件中的整数。
同样可以用上述的方法,不过可能需要多遍扫描。因为文件中的整数是多于&8*10^7,第一遍扫描后,位图的所有位都可能被置位。如果出现这种情况,那么用10MB内存存放&(8*10^7)到&(16*10^7-1)范围数的出现情况,再次尝试。平均性能几乎是扫描1次。
:给10MB的内存,给一个40亿整数的文件,找一个不在文件中的整数。只能扫描文件1遍
暂时未想到确定性的算法,这里给出一种近似的方法。随机生成200万个数,然后排序。扫描文件1遍,把文件中出现的对应数删除,比如200万个随机数中有5,而文件中也有5,那么把随机数5从数组中删除(简单置为-1即可)。最终随机生成的200万个数中会剩余
(2*10^6) * ( 1 - (4*10^9)/2^32) ,取其中的任意一个即可。几乎不会失败。
越来越多的大公司,开始关系对文件的处理,上面所说的空间受限的问题,其实也基本都是和文件打交道。基于文件的处理,基本都是寻找,或者排序,最最核心的,就是减少文件读取的次数。除了位图法,还可以考虑哨兵,典型的案例就是外排中,增加单个文件大小的方法。
eg3.1:给定一个包含个32位整数的顺序文件,找到一个至少出现两次的整数。
-- 《编程珠玑》
思路1:如果内存不受限,用位图技术,必有2个数会落到同一位中,其实是运用了鸽巢原理。32位整数能表示的最大数为,小于43亿。
思路2:如果内存受限,采用二分搜索法。由
于4.3G&32位的整数空间,根据鸽笼原理,肯定会有重复的整数。搜索范围从所有的32位正整数开始(全部当成unsigned
int,简化问题),即[0,2^32),中间值即为2^31。然后遍历文件,如果小于2^31的整数个数大于2^31,则调整搜索范围为
[0,2^31],反之亦然;然后再对整个文件再遍历一遍,直到得到最后的结果。这样一共会有logn次的搜索,每次过n个整数(每次都是完全遍历),总
体的复杂度为o(nlogn)
eg3.2:有一个文件,有很多很多的整数(也许有100亿),寻找其中最大的K个。 --
《编程之美》&
列举几种解法
解法1:如果元素不是很多,用快速排序,然后遍历找到最大的K个。总的时间复杂度为
O(N logN) + O(K)
解法2:找K个数中最小的那个,就是第K大的数。利用二分搜索找到第K大的数,然后在遍历。总的时间复杂度为
解法3:如果数据不能全部装入内存,上面两种方法不是很好。可以利用堆排序,即维护一个K个元素的最小堆即可。每次新考虑的一个数,如果比堆的最小数还要小,丢弃;如果比堆的最小数要大,那么替换最小元素,然后调整堆。时间复杂度为
解法4:如果数据的范围有限,可以利用计数法,即扫描文件一遍,记录每个整数出现的次数,然后再从大到小取最大的K个即可。时间复杂度为O(N)
你需要相信,面试官也是人,他不会有心情花30分钟给你描述一个问题,或者让你做50页纸的推导,考算法的目的只是为了你的思维能力,而不是真的想让你搞定一个复杂的问题。大部分问题,都是有比较快速清晰的解决方法的。。。&
这绝对是你必须考虑使用的一种方法,如果有可能的话。动态规划这东西,在面试的时候比较沉重,不好描述,不好书写,而分治却刚刚好,美丽,快捷,易书写,
是面试官杀人越货的首选武器。分治的用法实在是太多了,几乎是无所不在,二分,快排,种群计数,各个唯美无比。。。&
eg4.1:给你一个长度为N的整数数组,请找出最大的子数组和。
-- 《编程之美》
一题其实可以用动态规划解决。定义两个辅助数组Start
[N] 和 All [N] ,Start [i] 表示从元素i开始,包含元素i的最大的一段连续数组和。All[i]
表示从元素i开始,最大的一段连续数组和。All[0] = max { A[0], A[0]+Start[1], All[1] }
&可以很方便的用动态规划解决。
MaxSum(int *A, int n) {
& All[n-1]=Start [n-1]=A[n-1];
& for(int i=n-2;i&=0;i--){
& & & Start[i]= max( A[i], A[i]+Start[i+1] ); &
& & & All[i]=max( Start[i], All[i+1] ); &&
&return All[0];
如果要求返回最大子数组的位置,可以在循环中记录一下。算法还是能保持O(N)的时间复杂度的。
eg4.2:求一个int(32bit)中,二进制1的个数。
-- 《代码之美》
可以参考eg1.1的方法1、方法2、方法3
排序和查找 排序出现的次数实在是太多了,很重要的一点,排序的东西才能用二分。二分是如此好用,以至于我们总是想着排序。查找和排序总是紧密联系的,当然,仅仅是为了查找,做一次排序,你需要衡量一下代价。。。&
eg4.3:有一个论坛,有ID发帖数目超过总数的一半,给你论坛所有帖子的ID列表,请你找到这个水王。
-- 《编程之美》&
解法1:先将ID排个序,然后取中间位置的那个ID即可。
解法2:每次删除不同的ID,最后剩下的ID即为所求。
扩展1:如果有3个发帖很多的ID,并且发帖的数目都超过了总数N的1/4,找到这3个ID。
以用类似的解法,维护3个候选者。对于新ID,检查3个候选者的出现次数。如果次数有0,那么将该候选者设置为新ID,并且把次数加1;如果次数都是大于
0,并且新ID等于其中的一个候选者,那么将该候选者的出现次数加1;如果次数都是大于0,并且新ID不等于三个中的任意一个,那么将三个候选者的出现次
数各减少1次。最后剩下的3个ID即为所求。
eg4.4:给一组一维的空间
[1, 6] [2, 4] ... ,请求是否有区间重叠。 -- 《编程之美》&
解法:将目标区间按X坐标排序,然后合并相交区间,最后扫描一遍合并后的区间,检查源区间是否在其中一个目标区间中。最后一步也可以利用二分查找。
减小问题规模
很多时候,题目看上去很吓人,仔细分析一下,就可以刨去其中大部分的无关内容,获得真正的出题意图,这一点很重要。另外有些时候,题目会在空间上做出一些
限制,这个时候,你可以考虑动态的对数据规模进行缩减,比如用减法或除法抵消,用抑或抵消,等等。。。&
eg4.5:给一个整数N,求它的阶乘N!,有几个0结尾。&&--
《编程之美》
解法:0的出现是因为2*5带来的,因此只要计算min(
2的个数, 5的个数)即可。又由于2的出现频率大于5,只要求5的个数即可
&eg4.6:盒子里有三种颜色的球,红黄蓝,可以用任意两个不同颜色的球,换两个另外颜色的球,比如1红
+ 1黄 = 2蓝。现在盒子里面有171个红球,172个黄球,173个蓝球,问,能不能经过若干次交换,最终变成同一颜色的球。&&--
TopLanguage
猜测:不能,最多只能是某种颜色0个,另一种1个,其余是第三种颜色。
eg4.7:有一组数,除了一个数只有1个,其他都是两两成对的,请找出那一个不成对的数。另,如果不成对的数有两个,该如何是好。&
解法:如果只有1个,可以将所有数做异或运算,最后的结果就是要找的数。如果是2个,那么先将所有数做异或运算,得到一个数,然后找到这个数的其中一位非0
bit,利用这一位将这组数分成两部分,不成对的两个数不会在同一部分,然后对这两个部分分别调用只有1个情况的算法即可。
常量法 典型的速餐方法,它的思想是,一组数,在某些情况下,和一定,通过这个常量,进行反推,可快速搞定一些问题。。。&
eg4.9:有一副扑克牌(你可以用任意方式来表示),被抽去一张,请快速找出这抽去的一张是什么?
-- 微软面试题
解法:算一下目前牌的数值总和x,原来完整的总和是y,则丢掉的牌是y-x。
编码 编码真是个好东西,它可以将复杂的问题抽象化。比如,对一个序列进行编码,可以直接映射到数组脚标上,大大提高访问速度。。。&
最近一次百度笔试题
eg4.11:有1000瓶超级名贵的葡萄酒,其中有1瓶有毒。这种毒药很厉害,哪怕被稀释了1000000倍还是可以毒死人的。但这个毒药一定时间后才
会毒发,时长是1个月。为了不浪费这些葡萄酒,有1000个壮士决定花5周的时间将毒酒找出,他们只希望最多有10个人牺牲,你需要如何安排才能实现。
-- TopLanguage&
不要轻视概率题,哪怕是最基本的概率常识。概率题之所以被青睐,因为它们往往违背直觉,容易让人陷入迷茫,这种场面是面试官喜闻乐见的。我曾经在
baidu面试中,被一道简单的概率题,调戏的脸面全无,至今想起,仍然是汗流满面。所以,为了人身安全,复习一下概率的基本知识吧。。。
&eg4.12:有一个长度为N的链表,N未知。希望你只遍历一次链表,就从链表中等概率的挑出K个数。
-- TopLanguage&
某博客的解法,非常好
a:首先挑出前k个数,保存在pick[1...k]中,然后从第k+1个开始遍历
i = k+1 to N do //这里N不知道,但是可以用链表-&next == null 来判断是否到达链表末尾。
r = random(1, i);
if (1 &= r&&= k);
简单数学证明如下:
归纳法,算法刚开始,对于前k个数被选中的概率都为1,,不失一般性,选择其中的第j个来讨论,
i)返回值为j的概率为1/k+1,所以j保留下来的概率为k/k+1
i)返回值为j的概率为1/k+2,所以j保留下来的概率为(k/k+1) * (k+1/k+2) = k/k+2
i)返回值为j的概率为1/N,所以j保留下来的概率为(k/k+1)&* (k+1/k+2)*....* (N-1/N)&= k/N
对于第k+1到第N个数,选择其中的数m来讨论,
i)返回值在[1, k]内的概率为k/m,所以j保留下来的概率为k/m,设m保存在第s位
i)返回值为s的概率为1/(m+1),所以j保留下来的概率为(k/m) * (m/m+1) = k/(m+1)
i)返回值为s的概率为1/N,所以j保留下来的概率为(8/m) * (m/m+1)&*....* (N-1/N)&= k/N
很多时候,你给的算法基本正确,但是还不够优秀。面试官会希望你优化一下。优化的方法有很多,就基本的思路就是,考虑一下到底哪里出现了浪费。常见的浪费
有两种,一种是用了比较沉重的运算,比如除法、取模等,你可能需要为计算来加速。另外有时候,你的算法还太粗线条,比如只需要符号,你却计算了总数等
eg5.1:求两个数的最大公约数。
-- 《编程之美》&
解法1:利用的原理
f( x, y) = &f(y, x%y) ,即辗转相除法
解法2:利用的原理
f(x , y) = f( y, x-y),即辗转相减法
解法3:根据两个数的奇偶性
is even, y is even f(x, y) = 2 * f( x&&1, y&&1)
is even, y is odd f(x,y) = f( x&&1, y)
is odd, y is even f(x,y) = f( x, y&&1)
is odd, y is odd f(x,y) = f(y, x-y)
eg5.2:有一个整数数组A[N],求其中任意N-1个数的最大乘积。
-- 《编程之美》
解法1:利用eg1.2的算法,计算出所有可能的N-1个数的乘积,然后遍历一遍找出最大的乘积。
解法2:利用N个数的正负分布情况。先扫描一遍,统计处数组中正数个数p,负数个数n,零的个数z,绝对值最小的正数a
和负数 b。
z &=2 结果为0
& & 如果n为odd &结果为0
& & 如果n为even 结果为除0外的乘积
& & 如果n为odd &结果为去掉绝对值最小负数后的乘积
& & 如果n为even 结果为去掉绝对值最小的正数的乘积
&eg5.3:估计一下快速排序的比较次数。
-- 《代码之美》&
cc(int n){&
&& if (n &= 1) return 0;
&& m = randint(1, n);
&& return n-1 + cc(m-1) + cc(n-m);
【六】 数据结构&
大部分面试时候,我们都是面向数组来设计算法,因为简单变化多,面试官好把握。但其他数据结果,同样也很重要。AVL,B树那样的可能比较复杂,但是链表、树这样的结构,也经常出没,我个人就碰见多次。。。&
1. 链表 eg6.1:给你一个单链表的头指针,在不使用大量附加数据或修改原有数据的前提下,检查一个单链表是否有环。 -- 微软面试题
解法:使用快慢两个指针,慢指针p
= p-&next,快指针q = q-&next-&next,如果相遇,那么就有环。
&eg6.2:给你两个链表,如何判断其是否相交,如果相交,如何找到两个链表的第一个交点。
-- 《编程之美》
解法:2个链表都遍历到尾部,即p-&next==null && q-&next==null,然后判断p == q。
&eg6.3:只给你一个指向链表中某元素的指针,请删除该元素。
-- 《编程之美》&
解法:将后一个元素复制到当前元素p-&value
= p-&next-&value,然后删除后一个元素。
2. 树 eg6.4:写堆排序的算法
一般算法书上都有的,这里就不列了
&eg6.5:判断一棵二叉树T中,是否包含另一颗二叉树P的结构。
-- 微软面试题
以上一些内容,只是管中窥豹而已。题目来源主要是一些快餐式的书和论坛,包括《编程之美》《代码之美》《编程珠玑》,其中特别推荐,TopLanguage
Group的“今天我们思考”专辑。快餐吃多了总会不营养的,需要慢条斯理的按食谱吃点营养大餐才能真正的强身健体,比如高大爷的圣经,《算法导论》,还有,波利亚的《怎样解题》。
TA的最新馆藏
喜欢该文的人也喜欢}

我要回帖

更多关于 前端面试题 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信