行者无疆 始于足下 - 行走,思考,在路上
创新工厂笔试
慕开复之名,一个小时的笔试,十一道题目,不算多,时间还算充裕。
选择题/填空题
-
关于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,到此为止。
百度电面
千呼万唤,数模成绩出来了,校赛二等奖,达到了赛前的预期,还算是不错的结果。之后就是准备自己的简历,开始找实习。
在网上闲逛了一天,看了各种各样的教程,重点推荐《简历制作——step by step》,了解基本原则,然后开始动手。简历的排版有多种方式,最基本的是word版,拉拉表格,搞搞字体即可;花哨一点的可以用ps,indesign,只是有些牛刀杀鸡罢了;我不想弄的那么花哨,因此我选择用[tex]\LaTeX[/tex]排版我的简历。正式动手之前,我扫了一下《LaTeX2e中文用户手册》,进一步熟悉了定制[tex]\LaTeX[/tex]的方法,并找到了以下资料作为参考:
- moderncv:一个漂亮的latex "documentclass"。
- jerry's resume:我觉得这个简历太长了……足足有四五页……
- pluskid's resume:非常简洁清爽的简历
我呢,就仿照着pluskid简历的风格,自己制作了一份,pdf和tex源文件可以在这里下载。然后就去88上找相应的信息,稀里糊涂的投了几家,包括百度、阿里、intel等。百度和阿里的效率很高,邮箱发过去简历,不到二十分钟就有了回音,百度更是在当天中午就打来了电话,问我第二天有没有时间,直接电话面试一下。我说好的。于是在6月13号下午一点,我找工作的处女面就这样献给了百度。
首先是客套的自我介绍,原来面试官是浙大02级的学长,怪不得对我这么“照顾”(至少在投简历时我不期望我的资本能够赢得这次面试的机会)。然后就是正经八百的面试。第一道题目是,给你十个瓶子,每个瓶子里装有白色的粉末,其中有一个瓶子中的白粉放入水中30分钟后可以变成蓝色(姑且把这粉末想像成硫酸铜)。现在给你无限制的水,问,在四十分钟内,最少能用几个瓶子,可以将这瓶特殊的粉末鉴别出来。我的直觉是这个问题与小学生的“天平挑苹果“的智力题类似——比如给你3个苹果,两个重量一样,另外一个比较重,用天平一次就能挑出来。我想到的大体思想还是先确定一个大概的范围,比如确定这个“硫酸铜“在前面五个瓶子中,然后在进一步缩小范围。但是此题的难点在于,所给的时间40分钟只够一次实验的时间,多出来的十分钟倒是没什么用,迷惑人用的。进一步想是不是该采用两个集合求交的方法来鉴别呢。此时时间大概过了三分钟,我的大脑依然在飞速的思索。最后我给出的答案是,将十个瓶子分为四组,分别是{1,2,3}、{3,4,5}、{6,7,8}、{8,9,10},每组三个瓶子都取出粉末放到编号为I, II, III, IV的瓶子里面。如果I, II同时变蓝,那么这个粉末就在第3瓶,如果III, IV同时变蓝,那么就是第8瓶,剩下的情况我们可以肯定这瓶粉末肯定在两个瓶子之中。不过结果不算完美,而我也只能得出这样的结果了。其实这道题目正确的答案是数的二进制表示法。我们将十个瓶子的编号{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}进行二进制编码,这样只需要四位二进制数即可,然后找四个瓶子装上水,对于白粉末,如果其二进制编码的某位上为1,我们就在相应的瓶子里放入该瓶的粉末(这话太绕了……),举个例子来说,瓶子3的四位二进制编码为0011,我们就在第I, II个瓶子中放入瓶子3中的粉末。所有的十个瓶子都这样做,最后,I, II, III, IV的颜色序列(蓝表示1,不变色表示0)就可以指示出“硫酸铜“所在瓶子的二进制编码!
第二道题目是一道概率题。概率是我的弱项,高中就学不好,大学更是一点都没有接触。题目大意是给你一个字符串(可能有几亿个字符),给定一个特殊的字符'a',再给定一个可以产生0和1的随机数发生器,然后让你写一个函数,等概率地返回'a'的一个索引(就是'a'在字符串中的位置,比如字符串为aaba,那么a的索引为{0, 1, 3},等概率地返回0、1或者3)。我说这简单啊,首先用[tex]O(n)[/tex]时间做一个扫描,将'a'的索引位置存储在另外一个数组中,假设为b[length_of_all_a],然后用随机数发生器产生一串0、1,转换成十进制,再做x = '0101000...01' mod length_of_all_a的运算,然后返回b[x]就行了。说完了我就知道肯定有问题,这么简单通俗的方法就是一个没有学过计算机的人也能想得出来。果不其然,面试官开始刨根问底了。先是问了我时间和空间复杂度是多少,我说都是[tex]O(n)[/tex],他说复杂度太高,我说要做扫描线性时间复杂度是必须的;然后他说有没有办法减少空间复杂度,毕竟最坏情况是[tex]O(n)[/tex],比如这个超长的字符串全部都是'a',那么存储索引需要的空间就是[tex]O(n)[/tex]的。我一时语塞,要了五分钟考虑时间。最后想出的方法是类似于二分的方法,首先肯定的是在空间复杂度小于[tex]O(n)[/tex]的要求下,我们不可能存储'a'的所有索引了。于是我想的方案就是看随机数发生器,如果是0,我们就去字符串的左半部分查找,否则就去右半部分查找,依次递归,当递归下去的字符串长度小于某个数值的时候,我们就用线性查找的方法,看看这个小串中有没有'a'存在,存在的话,返回索引值,否则向上回溯一层,去另一半查找。总之是很晕的一个山寨方法,而面试官竟然还能听懂,然后他问我怎么样证明这个就是等概率的呢。我说了几个“应该……“,都是凭感觉。再然后他给了我一个串“aaba“,照我的方法,前面个两个'a'被返回的概率有25%,最后一个'a'却有50%,这下我彻底无语了,只能承认自己没辙了。
第三个问题是关于c++的。问我c和c++的static关键字都有什么作用。我就balabalay的说了一通变量的作用域,c++中static class member和static class member functions的东西,可是面试官总是不满意,不停地问“还有吗……“,然后给个提示,我就继续balabala一痛,直到问地我再也无法balabala的时候才放手。
最后好像让我谈了谈自己做的项目,我就把四月份实验室做的哪个项目鼓吹了一通,然后谈了谈acm比赛,我说我只是了解,选拔赛被虐的很惨,对于进入校队基本不抱希望——暑假有时间实习(希望你给我个offer)。临结束的时候又问了一句“你对异步编程“有没有了解,我愣了,说不了解,只听说AJAX是异步Javascript和XML的意思。然后他问我还有没有什么问题,我就傻傻的问“我想知道这次面试中你对我的评价“。评价结果是“思维比较活跃,基础还算不错,但是接触的东西不够广泛“,大概如此。
整个面试过程约一个小时,头脑风暴,增加了自己的信心,也意识到了自己的差距。革命尚未成功,同志仍需努力,暑假,一定要好好把握。
开学第一天
连上八节课,竟然都在曹西104,而且都是双语课:
- 计算理论:很抽象很基础的一门课
- 操作系统:李善平老师,讲课非常风趣
- 汇编与接口:楼学庆老师。有些吃不消。也不说具体要求,上来就开始讲课。不过去年的汇编通识课虽然成绩不好,还算打下了点基础
感觉还是有些迷茫。别人都有自己的导师、自己的实验室、自己却没有。前两年在旅行者身上花费了太多的精力。剩下的时间,该给自己的就业简历上增加点砝码了。这半年选了三十分的专业课,六分是在补大二的课程。挺过去就发达了。剩下的一年半,还剩二十多分加一个毕业设计。然后就是找工作了。88work版上好不热闹。浙大又要迎来一年一度的招聘大战了。不过以我的成绩和基础,想在本科毕业就进入一流的IT公司,我看有点悬。想象中,想Google、Baidu这种纯技术的公司我基本是没戏的。目前想的就是像网易、阿里巴巴之类的技术性略低的公司。老实说我前两年还是学了些东西的。Gnu、Emacs、Bash、Dhtml,毕竟我看来,周围的同学成绩虽然比我好,但是却不一定有我能折腾。
旅行者的小网站算作对旅行者最后一份责任吧,也是送给自己的一份礼物。两年半,这期间有过辉煌、有过悲泣、有过欣喜、有过迷茫、有过厌烦、有过自闭、有过责任,太多太多的东西。成长是痛苦的,大二的一年、几乎是一个人独力苦撑,这种苦、这种迷茫、这种责任、这种压力,无法释怀,只是在旅行者散伙饭上醉的一塌糊涂,一醉解千愁。都结束了。对于旅行者的未来,我已经有心无力,一切全凭造化了。
昨天和momo去看布袋了。还是那么的坚强,让人看了就有一股不服输的精气。期间谈到了我的高中岁月、这可打开了我吹牛的话匣子,慷慨陈词到八点多才想到公交末班要回去了。呵呵。
给自己一个简历: 本人,浙江大学毕业,
- 成绩:中等(争取大三好好学到偏上的程度)
- 英语:四级,六级,上海中级口译证书(打算安排到大三下空闲时来搞定这件事请)
-
项目经验:
- 浙江大学校车查询系统(目前只有linux版,尚待改进)
- 旅行者网站项目(正在赶工,已经熟悉html、css、正在学习javascript)
- 尚待添加
- 专业技能:LPI-1, LPI-2(在找工作前一定要过)
-
社会实践:
- 担任浙江大学旅行者户外会长一年
- 曾经单车走过京杭大运河、川藏线、青海湖
- 在第二届中国绩溪山地户外挑战赛中获得第四名
- 实习经验:有待添加
任重道远,去吃饭了。晚上汇编实验。