-
了解你所
面试的公司:产品,成立时间,融资,竞争对手;
-
-
java/c++ 熟练掌握一门,python
面试算法题其实也ok。
-
对语言的细节特性有足够的理解,理解语言之间的差异,比如解释执行vs编译执行,java jvm, garbage collection等;
-
最好熟悉一门脚本编程语言如Python/ruby;
-
至少知道两种n*log(n)的排序算法,比如快速排序和归并排序。merge sort 很重要,比如K-way merge sorts;
-
掌握二分查找思想及应用场景,灵活处理类似问题,比如search in a sorted array查找、实现sqrt()等问题;
-
Hashtable: 透彻理解Hashtable的原理、性能、碰撞处理,并能用array (in your favorate language) 来实现一个简单的hashtable,考虑多线程的情况;对于java的hashmap 要了解java hashmap和hashtable区别,concurrenthashmap, linkedhashmap.
-
Binary Search Tree的基本操作比如添加、删除节点,树与其他数据结构的相互转化, BST删除节点操作基本都会挂。
-
二叉树的各种遍历算法(前序、中序、后序、层序),根据遍历结果重建二叉树;
-
K-ary trees(一个树有k个children)/trie-tree的实现算法和应用场景;
-
大体了解一种平衡树,比如(red/black tree, splay tree or AVL tree) , 比如知道treemap的内部实现是red/black tree, 了解database index 所用的b+ tree/b tree.
-
理解Min/Max heap的实现、各种操作时间复杂度和应用场景,熟练解决查找top(N)类型问题;
-
Graph在内存中的三种构造方式(objects and pointers, matrix, and adjacency list);
-
遍历算法BFS/DFS,分析时间和空间复杂度,以及具体实现
-
结合Graph常考的算法比如拓扑排序,最短路径以及最小生成树算法
-
掌握基本的Dynamic programing的思想,熟练解决基本的DP问题,比如两字符串的最长子串,字符串之间的edit distance等;
-
理解操作系统中的进程、线程、以及它们之间的区别,理解系统并发操作中的常见问题(死锁),以及如何使用locks, mutexes, semaphores来解决并发问题。
-
理解面向对象
设计(封装、继承、多态),能把一个模糊定义的业务需求用OO的方式抽象(比如
设计电梯、停车场等);设计模式:Singleton(线程安全版本)、factory等;
-
java primitive type的内存(boolean: 1 byte, int: 4 bytes, long: 8 bytes),了解基本位操作;
-
理解分布式系统的基本概念,解决的问题以及分布式系统设计中CAP(Consistency, Availability, Partition)一致性、可用性、高性能之间的trade-offs;
-
-
linux基本命令: kill -9, scp, ps -ef, netstat;
-
sql
数据库基本知识:join,index,简单的sql语句:从table中找出成绩第二好的学生姓名;sql与nosql
数据库区别,简单了解几种nosql数据库;