原文链接:
11月1日的一面。面试官比较腼腆。出的题也比较手下留情:
1、找出有N个元素的数组中所有任意两数之和等于M的组合。要求时间复杂度为O(N)。
《编程之美》上的原题,阿里巴巴面试的时候就考过的老题了,Hash直接搞定。
2、给出一个方法,找出由字符串A变换为字符串B的最少步数(例如abc->adbc可通过增加一个d完成,accd->acd可通过删除一个c完成,abcd->accd可通过修一个b为c完成。abcd->acbd可通过替换b和c完成。以上四种操作都定义为一步操作。)
《编程之美》上的原题,惟独增加了替换操作。可惜我现场没做出来……
3、一架飞机失事后,黑匣子发出求救信号,搜救直升机上仅有一套信号接收装置,当离黑匣子越近时,该装置的指示灯就闪烁得越快。让你给出最快时间内找到失事飞机的办法。
我给出了根据信号强弱变化找出割圆线段的垂直平分线的方法,但面试官说还不是最快的方式……
4、给出一个函数,返回两个中文词汇之间的相关性的量化值。例如f("键盘","鼠标")=10000,f("键盘","窗帘")=20。
我刚开始建议根据百科全书建立一棵目录式的多叉树,然后返回树中两节点之间的距离。面试官不认同,并提示使用基于统计的方法。我便说通过网页和文献扫描,在以句子为窗口下统计词语之间出现的条件概率,也即搜集其互信息。面试官表示认同。但又接着问如果有某个词语同所有词相关性都很大怎么办?我说单独处理。面试官说我不想单独处理。我GG……
5、忘记了……貌似也没做出来……
一面应该是刚刚及格过了。二面就杯具了……
11月4日的二面,这次的面试官是个非常严谨和思维敏捷的人,我最后也止步于此:
1、设计一个数据结构,实现O(1)时间内返回数组内的中位数。
我先后使用了O(1)栈、平衡搜索二叉树、桶排序、最小堆来实现,但面试官都说不是他心目中理想的结构,我随后GG。
2、2N个芯片,其中有小于N个芯片是坏的。现有一台测试机,可以插上两块芯片互相检测对方。如果是好芯片,则会如实报告另一芯片是好是坏,如果是坏芯片,则可能误报。但是所有坏芯片的误报方式是一致的。用最快的方法找出这2N个芯片中哪些是好的,哪些是坏的。
直接GG……
3、两串珍珠项链,珍珠个数都是N个,但是珍珠的颜色各异。让你在O(N)时间内检测出这两串项链是不是一模一样的。
rotated array的比较(《编程之美》原题) + KMP算法。唯一做出来了的题。
4、一个概率发生器,以0.7的概率产生1,以0.3的概率产生0。问如何用该发生器组成一个以0.5的概率产生1,以0.5的概率产生0的概率发生器。
我尝试用贝叶斯公式展开,发现不太可能。随后GG……
5、在一个64位的操作系统上,有2G的物理内存(无swap),malloc了2.1G空间,并从0开始逐渐赋值。问会在哪一步出错,出什么错?
地址空间足够,malloc不会报错,我估计会在对arr[2G]赋值时报错,但是回答不出错误类型。面试官和我至此都已崩溃……