下面浅谈一些自己这个CS小本找工作的肤浅经验,主要是给08、09的后辈们一些参考
。
主要包括数据结构、算法、C语言、C++的OOP思想等几个方面。
1.数据结构
(1)数组
关于数组的题目特别的灵活,比如无序数组中找出最大的2个/K个、整数数组中找最大
连续和等等。《编程珠玑》中有一些很好的讨论,可以读读。
(2)链表
链表的各种问题,比如判断是否有环并确定环入口、判断两个链表是否相交并判断相交
点等等。在很多链表问题中,快慢针思想很有用。单链表是根本,但也要熟练运用双向
链表、循环链表。
(3)树
关于树,二叉树必须掌握,另外也要了解K叉树、红黑树、B-、B+树的一些基本概念。
(4)图
图的深度和广度优先算法思想和应用场景,要比较熟悉。并且要能熟练应用,比如找迷
宫路线等。
(5)字符串
最好熟悉C标准库中string的常用函数实现,难一些的可能就算KMP了。
(6)有序堆
大/小根堆的调整、保序操作要熟悉。另外算法部分也要用到,比如堆排序。
(7)栈和队列
基本思想,还有一些简单的灵活应用,比如用两个栈模拟一个队列等。
(8)其他
可以实现一些查找从属关系操作的并查集结构,另外某些技术的实现利用了什么数据结
构也可以有适当的了解,比如STL的set是用红黑树实现的,等等。
2.算法
要熟练掌握基本算法和思想,至于熟练的程度,应该是大部分算法题可以在几分钟内给
出解法,而刷过大量ACM题的话,应该算是出色的interviewee了。
各种经典算法思想要熟练掌握。比如,对于贪心要知道如何证明假设,对于动态规划要
会快速找出最优子结构和递归的公式。
(1)排序
各大排序算法都是必会的,对于选择、冒泡、希尔、归并、堆、快速、桶、基数、计数
等排序算法,不仅要会写,还要能将其中的思想提炼出来运用。这在面试中是经常被问
到的。
(2)查找
查找也是很重要的,因为应用很广,比如信息检索、搜索引擎都是大量数据的查找。但
对于小本,不会问你这些业内技术的问题,而会看你对哈希思想和设计、二分查找和条
件的理解和灵活运用。
(3)动态规划
有动态规划思想,会观察最优字结构和得到递归公式。
(4)贪心
对于贪心,最重要的,不是算法的实现,而是算法的假设的证明。面试时,一般都会要
求数学证明。绝大部分可以用归纳法解决,但有的其中可能会用到代数/几何等知识。
(5)二进制思想
二进制思想在某些应用中非常有用,比如可以利用二进制提供线性无关本质的方法,具
体地说包括位图、某些称量问题、0-1背包,都是二进制思想的本质。
(6)海量数据的相关问题的算法思想
可以看看《编程之美》等书,里面某些专题有一些不同方面的讨论。
(7)其他
关于算法的内容,很多很多。还有一些不太具有代表性,但是也要知道。
3.C语言
或某面向过程的经典语言,如Pascal。但其实C既然大一学过,如果没有熟练掌握实在
有些过不去。注意,不一定要“精通”,但要“熟练”。
(1)关于指针
有一些看上去很拗口的内容,比如指针数组、数组指针、函数指针、指针的指针等,还
有与const有关的一些概念,比如指向常量的指针变量、指向变量的指针常量、指向常量
的指针常量等等。还有一些与传参、返回值有关的内容。
(2)关于内存
C语言的程序内存分配情况,这其实与很多方面都有关联,比如堆、栈、编译等等。
(3)关于预处理
比如条件编译、宏定义等,有很多可说的点。
(4)其他
C语言一般用的念头都比较久,如果写的代码多,基本各个点都在平时涉及到了。但精华
部分可能还是要去读一些书才知道。
4.C++的面向对象编程思想(OOP)
(1)关键字
对static、const、virtual、public、private、protected、friend等关键字的各种用
途的理解。
(2)多态
多态是OOP的精髓之一,这涉及到继承/派生、虚函数、虚继承/多重继承等等很多细节。
(3)类的基础知识
构造函数、析构函数、拷贝构造函数、赋值函数等相关要点,说起来也很多。
(4)C++中一些区别于C的特性
这也很泛,比如C++中static、const的作用就比C丰富。另外OOP本身就已经是一场革命
。
内联的思想vs宏定义,const变量vs宏定义,动态存储管理,重载,动态绑定/静态绑定
,
c++中的struct和class什么关系,struct可不可以被继承,等等。
(5)其他
运算符重载、覆盖/重载/隐藏的区别、STL、函数模板/类模板/泛型编程,等等。
5.操作系统/网络/数据库/组成原理
这个根据公司不同,会有不同的要求,不过基本上,只要掌握基本知识就OK了。不过如
果真不擅长的话,只要上面四方面比较扎实也OK。
6.网络编程/并行编程/系统编程等
这是一些具体的编程技术,对于小本,不会没有关系,会的话算是bonus。
7.Linux
不会没有影响,这个如果会的话,也是bonus。第一层面是熟悉一些命令、VIM/emacs等
编辑器的基本使用、gcc/g++的基本使用;第二层面就是bash和linux编程;第三层面就
是读内核了。作为校本,到第一层就OK了。如果在实验室和师兄师姐们研究过内核,就
会让面试官的眼睛放光。
8.脚本语言
比如python、perl等,也是bonus。
9.外语
(1)英语
最好考过TOEFL,科大同学的读写能力都可以,口语和听力最好可以胜任基本交流,会
自我介绍、项目介绍和讨论、思想/个性/性格/爱好等方面的讨论和交流。
(2)第二外语
对某个小语种有一些初步掌握也是有一些好处的,比如日语、法语、德语、西语、韩语
等,一是体现自己的文化多元性,二是侧面展现自己的丰富。
10.智力题
并没有通法,想到多少就和Interviewer交流多少,让他/她知道你的思维走到哪里了
,
不要不说话就好。
11.言谈
踏实、诚恳、自信、自然。对于Interviewee,面试的最高境界是:谈判。不卑不亢,
双向交流,有问有答,有礼有节。要表现出自己良好的表达、倾听、解释和交流的能
力。而面对面试官的挑衅,在证明自己能力OK的基础上主动巧妙还击,因为并不是所
有面试官都懂得尊重你和科大。
12.the key to prefer a certain position
有的人看中base,有的人看中package,有的人看中option/stock,有的人看中晋升空
间,有的人看中户口,有的人看中低工作强度,有的人看中工作环境,有的人看中公司
文化,有的人看中细分的行业领域前景……
因人而异,选择你自己认为对的。
13.参考书籍
(1)数据结构:严蔚敏老师的《数据结构》就可以了。
(2)算法:CLRS的《Introduction to Algorithms》、《编程珠玑》、《编程之美》。
大二的同学时间充
裕的话可以看看《计算机程序设计艺术》。
(3)C:《Expert C Programming》,这本不厚,可以读一读。
(4)C++:入门就读《C++ Primer》或《The C++ Programming Language》,但是这
个是大部头,一般人读不下去,可以先读读也是Lippman写的《Essential C++》,然
后读读《Effective C++》,这两本都不厚。
14.epilog
以上属个人拙见,请各位去糟取精。如若有误,望各位指正,我会及时修改,减少误
导。若以为无可取之处,只当无视就好。最后希望科大越来越好。