行者无疆 始于足下 - 行走,思考,在路上

创新工厂笔试

慕开复之名,一个小时的笔试,十一道题目,不算多,时间还算充裕。

选择题/填空题

  1. 关于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;
    }
    
  2. 关于什么叫数据库主键。

  3. 关于路由器和交换机的区别,哪个用来连接不同网段、分隔子网或者是分隔不同网段、连接子网。

  4. 进程和线程的区别(调度、控制、共享内存、通讯方式)。

  5. 排序复杂度哪个不是[tex]O(n\lg n)[/tex](二分插入排序、快速排序、归并排序、堆排序)。

  6. kmp算法填空(略微记得一点原理,忘差不多了……)。

  7. 有5道工序,其中有一道工序不能放在最后,问有多少种排列方法([tex]5!-4! = 96[/tex])。

  8. 内存分页算法的缺页次数(先进先出、最近最少、理想页面置换算法,完全不会……)。

  9. tcp和udp的区别

  10. 递归函数:

    		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道题目左右吧。我报的是系统运维工程师,临交卷的时候在草稿纸上记了一下题目,现在写出来供大家参考。

基础部分
一、计算机基础知识部分

  1. 下列哪些可以用作并发控制(多选) A、信号量   B、原子操作     C、自旋锁   D、管道 【AB】
  2. 快排和堆排序的最差情况下的复杂度是多少【O(n^2), O(n\lg{n})
  3. 关于设计模式【不会、蒙的……】
  4. 简述TCP建立连接的过程【三次握手……】
  5. 简述RAID1和RAID5【依稀记得当初查过百度百科,胡侃了一通】
  6. 最大子段和写代码【这个应该没啥问题,就是那个O(n)的算法】

二、Java部分

  1. Java,abstract,finally等【凭感觉】
  2. Java……【凭感觉】
  3. Java……【凭感觉】
  4. equals()方法和hashCode()方法区别【是不是类似于PHP中的==和===两个运算符之间的区别?】

三、数据库部分

  1. 列举至少三种形式的数据库索引【不会……】
  2. 给两个表:
    1. 写SQL查询语句【SQL,还涉及到子查询和排序,比较复杂,只写出了基本样子】
    2. 问这种情况下的表应该怎样建索引才能提高效率【不会……】

四、C++部分

  1. STL,map<int, string> m,问m.insert(map<int, string>::value_of())方法和map m[1] = "test"有何区别【不太会……】
  2. const pointer【char *p、const char *p、char const *p、const char const *p的区别】
  3. c++【忘了……】
  4. c++【虚函数代码、蒙的】

专业部分

  1. Linux系统中如何查看CPU、内存、硬盘、网卡型号【cat /proc/cpuinfo,cat/proc/meminfo……】
  2. Linux中如何查看某个分区的大小,如何查看某个目录的大小【df -h | grep sda、du -h --max-depth=0 .】
  3. Linux中如何查看网卡的工作模式、速度、IP地址、路由信息【ifconfig、route、/etc/network/interfaces?……】
  4. 写出DNS、FTP、Http、Https、POP3、SMTP、SNMP、SSH、TELNET等应用层协议的底层传输层协议和端口号【能写多少写多少】
  5. 给定三个终端截图,问你这三张图分别是那个命令的运行结果。(第一个应该是free命令,第二个是top命令,第三个不知道……)【free、top、还有一个不知道……】
  6. 给你一段apache的日志,让你用Shell Script、Python、Perl和Ruby写脚本,求出哪个资源如(... GET \apache.gif ...中的apache.gif)被请求的次数最多。【Shell Script基本写出,Python给出了思路、Perl和Ruby不会……】
  7. 正则表达式提取URL地址中的站点名称和资源名称【参见正则表达式30分钟入门
  8. 给出几种服务器之间拷贝文件的解决方案【NTF、Samba、ssh(scp)、rsync、ftp等】
  9. 给出几种web server并简述其特点。【MS IIS、Apache、Lighttpd、nginx】
  10. 写出你所知道的web框架并简述其特点。【Java SSH、Python Django、RoR(其实都不会……)】
  11. 写出你所知道的几个自由软件开发者并简评。【RMS、Linux、Eric Raymond、Knuth……胡侃】
  12. 写出你最拿手的三项计算机技能。【胡侃】

【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种必做的。类型分布大概如下:

  1. c/c++(what's operator overloading, what's copy constructor)
  2. oo(class, instance, inheritance, polymorphism, how to modeling)
  3. gtk(layout, glib)
  4. qt(qmake)
  5. linux file system(/proc directory, how to mount multiple file systems)
  6. linux device driver(what's io port? how to install and remove driver?)
  7. php
  8. javascript
  9. regular expression
  10. windows API
  11. xml
  12. uml
  13. networking
  14. python(list, tuple, dict)
  15. shell script($PATH, find command)
  16. logic
  17. 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]的方法,并找到了以下资料作为参考:

我呢,就仿照着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,而且都是双语课:

  1. 计算理论:很抽象很基础的一门课
  2. 操作系统:李善平老师,讲课非常风趣
  3. 汇编与接口:楼学庆老师。有些吃不消。也不说具体要求,上来就开始讲课。不过去年的汇编通识课虽然成绩不好,还算打下了点基础

感觉还是有些迷茫。别人都有自己的导师、自己的实验室、自己却没有。前两年在旅行者身上花费了太多的精力。剩下的时间,该给自己的就业简历上增加点砝码了。这半年选了三十分的专业课,六分是在补大二的课程。挺过去就发达了。剩下的一年半,还剩二十多分加一个毕业设计。然后就是找工作了。88work版上好不热闹。浙大又要迎来一年一度的招聘大战了。不过以我的成绩和基础,想在本科毕业就进入一流的IT公司,我看有点悬。想象中,想Google、Baidu这种纯技术的公司我基本是没戏的。目前想的就是像网易、阿里巴巴之类的技术性略低的公司。老实说我前两年还是学了些东西的。Gnu、Emacs、Bash、Dhtml,毕竟我看来,周围的同学成绩虽然比我好,但是却不一定有我能折腾。

旅行者的小网站算作对旅行者最后一份责任吧,也是送给自己的一份礼物。两年半,这期间有过辉煌、有过悲泣、有过欣喜、有过迷茫、有过厌烦、有过自闭、有过责任,太多太多的东西。成长是痛苦的,大二的一年、几乎是一个人独力苦撑,这种苦、这种迷茫、这种责任、这种压力,无法释怀,只是在旅行者散伙饭上醉的一塌糊涂,一醉解千愁。都结束了。对于旅行者的未来,我已经有心无力,一切全凭造化了。

昨天和momo去看布袋了。还是那么的坚强,让人看了就有一股不服输的精气。期间谈到了我的高中岁月、这可打开了我吹牛的话匣子,慷慨陈词到八点多才想到公交末班要回去了。呵呵。

给自己一个简历: 本人,浙江大学毕业,

  • 成绩:中等(争取大三好好学到偏上的程度)
  • 英语:四级,六级,上海中级口译证书(打算安排到大三下空闲时来搞定这件事请)
  • 项目经验:
    1. 浙江大学校车查询系统(目前只有linux版,尚待改进)
    2. 旅行者网站项目(正在赶工,已经熟悉html、css、正在学习javascript)
    3. 尚待添加
  • 专业技能:LPI-1, LPI-2(在找工作前一定要过)
  • 社会实践:
    1. 担任浙江大学旅行者户外会长一年
    2. 曾经单车走过京杭大运河、川藏线、青海湖
    3. 在第二届中国绩溪山地户外挑战赛中获得第四名
  • 实习经验:有待添加

任重道远,去吃饭了。晚上汇编实验。




Host by is-Programmer.com | Power by Chito 1.3.3 beta | © 2007 LinuxGem | Design by Matthew "Agent Spork" McGee