Work - 行者无疆 始于足下 - 行走,思考,在路上
杀进百度三面!
早晨8点半,晨梦中接到了百度的面试通知……立马起床,打起精神,吃好早饭,回来啃书,看《编程之美》和《算法之道》。下午四点半面试,我就琢磨着还有7个小时左右,去掉2个小时吃饭、上网、发呆、上上厕所的时间,大概还有5个小时的时间,抱抱佛脚也够了。
下午3点换了身新行头,又去打印了几份简历,快四点在北门果断打上了出租,直奔者浙江百瑞大酒店。
面试官比较和蔼,还给我倒了杯水,贼感动……先是传统的自我介绍,我就开始耍无赖了:“简历上的东西我就不说了,我就单说说我的潜力和优势吧。您一边看简历我一边说。”然后就开始扯淡,还扯上了电影《The Pursuit of Happyness》的句子……一通胡扯后,感觉面试官有些被我震住了,好了,气场来了就好办了……
接下来就是问简历上的东西,先问实习做的东西,这个比较熟悉,又是一通胡扯,包括Shell、集群、Python、Nginx、负载均衡等等,反正就是有东西扯就行了,别停下来。
然后看我对linux比较熟,就让我写个Shell脚本,要求是输出下面的三角多维数列到一个文件中:
0 0 1 0 1 2 0 1 2 3 0 1 2 3 4 0 1 2 3 4 5
这个应该比较简单,两分钟完成,没什么大问题。注意下Shell Script中的数据类型就行啦。
然后又给我出了个小题目:给定一个数组A[n],给定一个数字m,求有多少对[i,j],使得A[i] + A[j] = m。这道题目最初的思路肯定是排序,然后大小配对。第二个思路也是数组先排序,然后对[1, m - 1], [2, m - 2]等进行二分查找……不过面试官还不算满意,又问我可不可以不经过排序。我左思右想,说了句那就用哈希表吧,直接线性查找就行了……貌似说对了,pass ……其实我对哈希表不太熟的。
然后就问我了解哪些排序算法,各种排序算法有什么特点,我就把我知道的各种排序算法都吹了一通,单独考了快速排序——其实要让我当场写,我还真不一定写得出来。还有一些小问题,比如linux常用的一些命令(df, free, du),还有OSI七层参考模型,tcp三次握手过程等等,剩下的我就想不起来了。
最后问我有没有什么要问的,我就问了三个问题:
- 百度的中文搜索是全球第一、为啥英文搜索比不过google,这点百度自己怎么看;
- 百度内部用什么开发语言和开发工具;
- 我自己在这次面试中有哪些需要改进的部分。
就这样,然后在HR mm的房间里看了会儿喜羊羊和灰太郎,就进了二面。
二面并没有问太多技术性的问题,感觉主要是聊天为主了,又深入问了我实习期间做的一些东西,然后问我为什么会选择运维而不是搜索算法部门,我就说自己没有竞赛基础,比不过大牛,而且也只是个本科而已,相反自己对linux比较熟,也比较感兴趣。然后他就让我说说对运维的理解,我就balabala地吹了一通。又问我简历是用什么排版的……我说
用LaTeX。问我是不是一个心细的人,具体表现在哪里?我就自卖自夸地说自己是个“胆大如斗心细如针”的人……然后问我工作是否严谨,体现在哪些方面?我就说自己写代码都怎样加注释,为何简历用[tex]\LaTeXe[/tex]排版等等……
后来也给我出了一道题目,感觉有点小学生脑筋急转弯的意思,说甲方乙方做一个游戏,总共是100个球,两人轮流取球,每次只能取走1-5个球,甲方先取,拿到最后一个球的那一方为胜利者。问甲方应该采取的方案才能保证自己的胜利……这个比较简单了,2分钟就有思路了,简单叙述了下,pass。
然后就完了,告诉我回去等三面的通知,说在两天内就会结束,我说周三要去上交听一个会议,很多人应该都会去,他对我提供的这条信息表示了感谢。over。
大概就这样,感觉百度的面试官还是挺和蔼可亲的,不向有道那样,不看简历上来就把你整晕,那就挂了。
明天下午2点三面,希望我自己能早点定下来吧,我的心已经飘到东南亚啦。
百度、腾讯、vobile
血淋淋的两天……
这几天事情实在是很多,以至于三天前发生的事情我已无丝毫印象,说说这两天的笔试吧。
16日上午去听课了,数字电子技术基础,大二时挂掉的一门课,讲触发器和时序电路的,发现自己依然是听不懂,庆幸自己终于没有去读生仪那个博士,否则各种硬件电路、FPGA还不得把我搞死。
下午两点百度的笔试,人很多,大概有20多个教室,算起来应该有5、6百人了。我投的是运维部运维开发工程师,可是linux、script等却没有考,考的全部是算法和c++方面的东西。大概的题目有:
-
根据不同场景选择合适的排序算法,场景有:
- 很少的元素
- 几乎有序的元素
- 关注最坏的情况
- 关注平均性能
- 元素是从一个密集的集合中取出
- 实现尽可能简单,代码尽可能少
-
给你一段哈希表的c++代码:
- 描述内存分布
- 理解代码含义
- 指出代码的逻辑错误和编程规范错误
-
c中的malloc/free和c++中的new/delete有什么区别和联系【考虑到new/delete和构造函数、析构函数之间的联系,以及new/delete是c++关键字而非库函数,可以进行运算符重载等等】
-
单入口单出口的有向无环图,给出一个算法,在已有的节点中插入若干个节点,使得从入口节点到出口节点经过的任意路径的长度都一致【瞎蒙的,记得有个NP的求最长路径的算法,在此基础上胡吹了一通】
-
二重哥德巴赫猜想:每个不小于6的偶数都可以表示成两个奇素数之和,请用你熟悉的语言编写一个函数,输出6-100000内所有偶数可以表示成哪两个素数之和,如果有多种表示方式,输出任意一种即可。要求:给出完整代码,在达到目标的基础上尽量高效简洁【打表法,a[100000],a[i]=1表示i为素数,然后循环】
-
系统设计题(这道题目不同职位不一样,终于算考点运维了):关于系统日志的备份和分析,请你设计一个好的方案,综合考虑网络带宽,系统资源,负载均衡等等……【大概是这样,胡吹的,IO-bounded/CPU-bounded,ftp/ssh/rsync等,负载均衡,想到的都说上了】
百度笔完觉得如果幸运的话应该会给个一面吧,不过也没抱太大希望了,毕竟自己的斤两自己还是心知肚明的。然后去了吃了晚饭,去实验室,打算搞台电脑,装个Linux,架个服务器玩玩,也好亲身实践下DHTML,CMS等;还有一直牵挂的旅行者小网站;架设个ftp,存放一些历史资料;有空还可以挂个论坛模块上去——我太邪恶了。在实验室翻箱倒柜,搬来了一个主机,一个显示器,偷了根网线加上许久未用积满灰尘的键盘,花了一个多小时的时间擦掉电脑上的灰尘,开机启动,123456撞大运地破解了密码,进入系统,得到了系统原先主人的信息——一个已经毕业的女研究生学长,确认后就下载了ubuntu 10.04 amd64版本,刻盘安装。设置好软件源,架好ssh,回到寝室远程登录架好了vsftpd,ftp至此初步完成。呵呵。接下来研究vsftpd详细的参数配置,实现诸如带宽限制、权限限制等高级的功能。
17日上午腾讯的笔试,场面更为火爆,笔试名单上大概有1250+的人数。笔试题目很多,由于试卷上有保密协议,所以这里不方便透露,题目大概是20道选择+代码填空8个+附加题,考点很广,c++的除了语言还有网络和操作系统的一些知识(我觉得这些对通过考研打牢基础的人是很有利的……),考完了感觉还不错,结果晚上面试名单就出来了,悲剧了……版上也有很多人抱怨,说感觉不错为啥一个面试机会都没有。可能找工作有时也靠运气吧,比如我一个百度保底的学长,google笔试直接挂掉,连面试机会都没有;比如很多大牛投了网易号称说要bs网易一下的,结果网易连个笔试机会都不发;比如上个月我的有道机试,260/270的秒杀,如果不是论坛上抱怨下恐怕也因HR的失误变成分母了……
下午回来看了会书,看了看NTP协议,淘宝上买的《ANSI Common Lisp》到货了,简单看了看,再领略了c++的宏伟,Java的臃肿,Shell Script的便捷,Python的Dynamic Typing后,Lisp的functional programming,是我一直所渴望了解的。长期以来Emacs的配置都是在网上找然后copy&paste,搞的自己都不好意思拿出手,趁着有时间好好学一学。海鸥的镜头和包也到了,至此自己花了六百大洋左右搞了一套古董机的单反,Seagull DF2000 + 35mm标准头 + 28-80变焦头 + UV镜 + Seagull相机包,性价比应该还算挺高的吧,用来练手练技术好了。
晚上去vobile笔试打了桶酱油,笔试题目有七道吧,大概如下:
- 写代码求N!中尾数中0的个数
- 写代码求1-N中数字'1'总共出现了多少次
- 估计一下全中国与你同名同姓的有多少人
- 12个蚂蚁站在木棍上,左边6个一队,右边6个一队,一声令下,左队蚂蚁向右运动,右队蚂蚁向左运动,如果两只蚂蚁相撞,则改变运动方向,蚂蚁会从木棍的两边掉落。问经过多少次碰撞后所有12只蚂蚁会掉落?【我的答案是36】
- 多关键字排序【多看看基数排序和字典排序】
还有一两道实在想不起来了……总之题目还是比较基础的吧,不算难。vobile笔试完又去听了IBM研发专场的宣讲会,据说每个人都有包包发——怪不得越到最后人越多,原来大家都是来拎包的啊……不过我不知道,听完招聘安排提前走了,亏了,呵呵。
晚上回到寝室看到88work版,就知道百度和腾讯都悲剧了。百度在意料之中,腾讯有点郁闷,不过算了。现在总结下,Google、百度、创新工厂、腾讯笔试被刷;网易有道止步一面;网易部门杀进面试,尚不知面试时间和地点;华数淘宝由于实习拿到工作保底offer,前景比较光明,正在犹豫当中,所以阿里系列的所有公司也不再投了——如果再受几个打击说不定就签了;微软不太喜欢,微策略虽然是米缸,看中绩点,为我所不耻,索性投也不投了;华为简历审核通过也不知道是啥意思;剩下的还有啥呢?自己的策略是不投游戏不搞硬件不投太小太没有名气的公司不投测试不投Java不投金融,好像也没有太多了。嗯。
其实想想人有时候真的是挺贪得无厌的,欲望是痛苦之源,我一直认为钱是一种手段,但绝不能成为一种目的。
差不多了,我也累了,忙完这阵,过了秋学期考试,争取定下工作,抽出一个月的时间出去兜一圈。加油吧。
创新工厂笔试
慕开复之名,一个小时的笔试,十一道题目,不算多,时间还算充裕。
选择题/填空题
-
关于c union type,求下列程序的输出结果(具体程序既不清楚了,考点在于union type的内存分布):
#include <stdio.h> union u { int i; char x[2]; }a; int main() { a.x[0] = '1'; a.x[1] = '2'; printf("%d\n", a.i); return 0; }
-
关于什么叫数据库主键。
-
关于路由器和交换机的区别,哪个用来连接不同网段、分隔子网或者是分隔不同网段、连接子网。
-
进程和线程的区别(调度、控制、共享内存、通讯方式)。
-
排序复杂度哪个不是[tex]O(n\lg n)[/tex](二分插入排序、快速排序、归并排序、堆排序)。
-
kmp算法填空(略微记得一点原理,忘差不多了……)。
-
有5道工序,其中有一道工序不能放在最后,问有多少种排列方法([tex]5!-4! = 96[/tex])。
-
内存分页算法的缺页次数(先进先出、最近最少、理想页面置换算法,完全不会……)。
-
tcp和udp的区别
-
递归函数:
int f(int n) { if (n == 0) return 3; else return f(n-2) + f(n-1); }
求f(10)(我的答案是没结果,应该是唬人的题目)
编程题
给定一个字符串,字符串中可能含有包含'(', ')', '[', ']',判定条件如下:
- '('和')'、'['和']'个数相等
- '('和')','['和']'完全配对,不能出现嵌套情况。
如符合以上两条,则返回True,否则返回False。
Example:
a(ab)[aa(ba)[aa]b]为True,而a((a)、ab(a[bbb)]c为False。
解决方案:
如果熟悉stack表达式求值算法,这道题目应该不在话下。设定两个计数器m和n,m记录'('和')'的个数的差值,'n'记录'['和']'个数的差值,再设定一个STL stack<char> par。
每当读到'('或'[',就执行push操作par.push('('),par.push('['),同时m++, n++;每当读到')'或']',就判断下栈顶元素和当前元素是否配对,如果配对,则par.pop(),否则直接返回False,同时m--,n--。
最后判断m和n是否为零即可。代码略去。
新鲜热乎刚出炉的网易笔经
投了网易招聘的两个职位,都是系统运维工程师,一封据信一封笔试邀请函……今天晚上6点早早离开公司,坐车到玉泉正门代售点买了回家的火车票,结果脑子进水了,本来要买9月30号的票,硬说成了买10月1号晚上到北京的票……还是无座…… 算了,怎样都要回家看看的。跟公司请了假,在家可以待到10月10号。然后可以继续实习,保证每天三天就行,剩下的时间可以边实习边找别的工作——如果想留在公司,非常欢迎。老婆说公司对我太好了,要是她的话就感动的留下来了。算了,废话少说,说说今天的网易笔试吧。快七点才到场,等了5分钟才拿到卷子,笔试卷子分为两部分:基础部分和专业部分。其中基础部分是所有人技术类岗位必做的试题,专业部分则是根据你报的岗位出的题目。考试时间是两个小时,大概有30道题目左右吧。我报的是系统运维工程师,临交卷的时候在草稿纸上记了一下题目,现在写出来供大家参考。
基础部分
一、计算机基础知识部分
- 下列哪些可以用作并发控制(多选) A、信号量 B、原子操作 C、自旋锁 D、管道 【AB】
- 快排和堆排序的最差情况下的复杂度是多少【】
- 关于设计模式【不会、蒙的……】
- 简述TCP建立连接的过程【三次握手……】
- 简述RAID1和RAID5【依稀记得当初查过百度百科,胡侃了一通】
- 最大子段和写代码【这个应该没啥问题,就是那个的算法】
二、Java部分
- Java,abstract,finally等【凭感觉】
- Java……【凭感觉】
- Java……【凭感觉】
- equals()方法和hashCode()方法区别【是不是类似于PHP中的==和===两个运算符之间的区别?】
三、数据库部分
- 列举至少三种形式的数据库索引【不会……】
-
给两个表:
- 写SQL查询语句【SQL,还涉及到子查询和排序,比较复杂,只写出了基本样子】
- 问这种情况下的表应该怎样建索引才能提高效率【不会……】
四、C++部分
- STL,map<int, string> m,问m.insert(map<int, string>::value_of())方法和map m[1] = "test"有何区别【不太会……】
- const pointer【char *p、const char *p、char const *p、const char const *p的区别】
- c++【忘了……】
- c++【虚函数代码、蒙的】
专业部分
- Linux系统中如何查看CPU、内存、硬盘、网卡型号【cat /proc/cpuinfo,cat/proc/meminfo……】
- Linux中如何查看某个分区的大小,如何查看某个目录的大小【df -h | grep sda、du -h --max-depth=0 .】
- Linux中如何查看网卡的工作模式、速度、IP地址、路由信息【ifconfig、route、/etc/network/interfaces?……】
- 写出DNS、FTP、Http、Https、POP3、SMTP、SNMP、SSH、TELNET等应用层协议的底层传输层协议和端口号【能写多少写多少】
- 给定三个终端截图,问你这三张图分别是那个命令的运行结果。(第一个应该是free命令,第二个是top命令,第三个不知道……)【free、top、还有一个不知道……】
- 给你一段apache的日志,让你用Shell Script、Python、Perl和Ruby写脚本,求出哪个资源如(... GET \apache.gif ...中的apache.gif)被请求的次数最多。【Shell Script基本写出,Python给出了思路、Perl和Ruby不会……】
- 正则表达式提取URL地址中的站点名称和资源名称【参见正则表达式30分钟入门】
- 给出几种服务器之间拷贝文件的解决方案【NTF、Samba、ssh(scp)、rsync、ftp等】
- 给出几种web server并简述其特点。【MS IIS、Apache、Lighttpd、nginx】
- 写出你所知道的web框架并简述其特点。【Java SSH、Python Django、RoR(其实都不会……)】
- 写出你所知道的几个自由软件开发者并简评。【RMS、Linux、Eric Raymond、Knuth……胡侃】
- 写出你最拿手的三项计算机技能。【胡侃】
【answer】是自己的答案,感觉总体上答的很一般,整套笔试题考的还是非常广泛的,也暴露了自己基础部牢靠的弱点和一些知识盲点。我想我应该买一本考研题册做一做了。继续加油吧。Fighting!
新鲜的刚出炉的热乎乎的淘宝和DeviceVM面经
折腾的一天,两场面试,感觉都还凑合。
第一场是华数淘宝的面试,关于华数淘宝和淘宝之间有什么区别和联系,我也没有细究,反正上午十点到了西湖国际大厦后只看到了taobao的字样。来到了前台,填写了一份履历表,一会一位男员工走了出来带着我来到了一个沙发处。有好几个桌子,都是面试官和学生们面对面地谈。
首先还是自我介绍。我就毫不客气巴拉巴拉地说了一通,连自己骑车玩户外的事情都吹了一通。面试官微笑,蛮厉害的嘛。接下来就开始考题目了。第一道题目是c语言指针的问题。问:
char *p = "abcd"; printf("%d", sizeof(p)); char p1[] = "abcd"; printf("%d", sizeof(p1));
我大概是脑子进水了,两个简单的问题都答错了,弄了一个非常尴尬的开端。然后又问我有没有用过内存拷贝函数?"memset?"我问。“不是,memcpy。算了,有没有用过strcpy”。“这个,用过”。“那你写一下这个函数的实现”。然个后我就很不争气的写了一个非常糙的实现,还是在面试官的提醒下才改对的,两个明显的bug。尴尬。
接下来问我对排序了解多少,知道哪些排序。我说我对那种[tex]O(\lg n)[/tex]的排序比较熟,他让我举例,我就把能想到的选择排序、冒泡排序、插入排序、快速排序、归并排序、希尔排序等等都说了。然后他让我描述一下快速排序的实现,我就balabala讲了一通——其实要让我写,短时间内我还真不一定能写出来。快排到此为止。又问我那些是稳定排序和不稳定排序,我说这个我真不清楚了,可能要看具体实现——很尴尬。“还有别的排序方法吗”,“有,当然有,比如桶排序——还是创新工厂的面试时学会的……”。我又balabala的吹了一通,把决策树都说上了,这些排序总算是问完了。
问我了解设计模式不?我说看过几页《大话设计模式》。然后他问了一个单例模式?我就傻眼了,嘟囔着说不出来。其实这东西一直想去研究,一直在拖。接下来问我程序的内存空间是如何管理的。我就说栈和堆的东西。蒙混过关。然后问我“给你两个栈,如何模拟一个全功能的队列?”我想了想,给了一两套方案,不过终究不完美。
中间问我java的vector是怎么回事?java有vector的?我愣了。然后他说那就说说c++ stl里面的vector和list是怎么实现的吧,又什么区别。这个问到点子上了。记得大二时扫《c++ primer 3rd edition》时恰好仔细研究过,我就balabala的说了一下vector<int> v的v.capacity()和v.size()的区别,看得懂的应该不用细讲,看不懂的看官,你的c++比我还差,赶紧回家补补。问完这个又问我进程和线程有啥关系。一个进程开辟出来的内存,其子线程是否能够访问等等,答得一般。
又问我在实验室做的项目(一个windows mobile界面开发的项目),问我GUI库中的button的onclicked()的动作是如何相映处理的。我就把Win32 API里面的消息循环机制又吹了一通。面试官表示很满意。
最后问我linux shell命令的东西,比如如何找出一个分区内占用空间最大的目录,我说用"du -h . | sort",如何看磁盘使用量——"df -h",如何查找文件等等,由于日常经常用linux小打小闹,所以这部分答的也还算可以。
大概就谈了这么多,最后他送我出去,还郑重地握了握手,感觉还凑合吧。
然后回到玉泉吃了个午饭,就赶往滨江区DeviceVM参加下午一点的面试。公交+打的跌跌撞撞到了盾安大厦DeviceVM公司,接待我的是一个ppmm。二话不说,先给了我一套题目,说时间一个小时,标记的必做,没有标记的选作——这个标记主要根据你应聘的职位来标的。我的娘,题目总共有十几页,大概是16种类型,不过我只需要做6、7种必做的。类型分布大概如下:
- c/c++(what's operator overloading, what's copy constructor)
- oo(class, instance, inheritance, polymorphism, how to modeling)
- gtk(layout, glib)
- qt(qmake)
- linux file system(/proc directory, how to mount multiple file systems)
- linux device driver(what's io port? how to install and remove driver?)
- php
- javascript
- regular expression
- windows API
- xml
- uml
- networking
- python(list, tuple, dict)
- shell script($PATH, find command)
- logic
- personal information
我不管是否必答,先把自己会的都答上了。其实题目都不是很难,只是考的比较广泛,这就看你平时的积累了。而且每种职位大概只有7个部分是必答的。我应聘的是linux c++开发工程师实习,Qt和Gtk必考,可是我只有了解,却基本不会,倒是把Shell和Filesystem基本都答上了……汗。
答完了给了我一份履历表,填完履历表过来一位男面试官。看着我简历问我一些问题。首先让我阐述下c++的多态性是怎么回事。我就balabala胡侃了一通,把RTTI和函数指针都侃出来了,面试官表示满意。然后让我介绍了下实验室项目,我又balabala说了一通,面试官表示还不错。问我有没有用过javascript,我说只用过document.write()……又问我如何写一个程序,探知另外一个c++可执行程序的堆内存使用情况。这个问题不太明了,他说就是让你写个调试器类似的东西,我说没什么思路,他说可以利用c++的运算符重载,重载一下new和delete,让new和delete输出一些信息。不过我头脑中没有任何重载new和delete的想法和回忆,晕了。
最后他问我实习时间可以保证多少。我说最多到十月中旬,问我什么时候考完试,我说7月6号。然后就这样结束了。我也不知道这么问究竟什么意思,淘宝的面试官也这么问我,不知是悲剧呢,还是心里觉得我这个人还有点潜质,打算发offer了。
Ok,到此为止。