- 以老师的十年任职经历来看(MorganStanley,google):
- 摩根士丹利
- 填空题
- 问答题
- 选项题
- 编程题
- Google
- 在线编程系统
- 校招特点
- 候选者基数大
- 感觉社招更大
- 缺乏足够履历
- 自己做项目,跟导师做,但是
- 在代码复杂性和质量上,差很多
- 候选者基数大
- 录取倾向
- 基础知识
- 编程能力
- 交流能力(低)
- Google全球录取率
- 0.2~0.4%(有一小部分是由于参选门槛低导致的)
- 哈佛大学:4~5%
- 摩根士丹利
- 以阿里校招为例:
- 来自计算机、软件、电子信息等专业,学习成绩优异;
- 熟练掌握流行的编程语言及工具,对数据结构、算法、数据库、操作系统基本原理、计算机体系结构、计算机网络、离散数学等基础学科掌握扎实;(这点占比很大)
- 技术热情狂热,强烈好奇心,有实际动手经验(编程能力)
- 技术成果丰富:(技术运用到实际场景并解决问题),或有重要学术论文发表在国家顶级会议或期刊上,或有相关计算机领域专利,如果获得国家级ACM决赛的名次,当然是极好的。
操作系统
进程vs线程?
64 位系统和 32 位系统的区别:
64位CPU GPRs(General-Purpose Registers,通用寄存器)的数据宽度为64位,64位指令集可以运行64位数据指令,也就是说处理器一次可提取64位数据(只要两个指令,一次提取8个字节的数据),比32位(需要四个指令,一次提取4个字节的数据)提高了一倍,理论上性能会相应提升1倍。
64位处理器的优势还体现在系统对内存的控制上。由于地址使用的是特殊的整数,因此一个ALU(算术逻辑运算器)和寄存器可以处理更大的整数,也就是更大的地址。比如,Windows Vista x64 Edition支持多达128 GB的内存和多达16 TB的虚拟内存,而32位CPU和操作系统最大只可支持4G内存。
网络
网络主要要解决的一个问题就是安全,可靠。如何实现呢?OSI七层模型
一层一层的进化而来,为了解决特定的问题,相反的,反而并不是从理论上来进行解决的。比如Java泛型,也是逐渐建立起来的东西 (工程性解决)
- 不可靠
- 丢包,重复包
- 出错
- 乱序
- 不安全(每层路由器都有可能有黑客窃听数据)
- 中间人攻击
- 窃取
- 篡改
- 抓包是个好东西。
关系型数据库
- 基于关系代数理论(和网络的建立就不一样了)
- 缺点:表结构不直观,实现复杂,速度慢
- 优点:健壮性高,社区庞大
ACID,指数据库事务正确执行的四个基本要素的缩写。包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。
JOIN和GROUP BY
select for update(死锁技巧)
乐观锁(比for update性能损耗小):读取数据,记录Timestamp;修改数据;检查和提交数据
事务的隔离级别:
- 1.脏读
- 允许读取到未提交的脏数据。
- 2.不可重复读
- 如果你在时间点T1读取了一些记录,在T2时再想重新读取一次同样的这些记录时,这些记录可能已经被改变、或者消失不见。
- 3.幻读
- 解决了不重复读,保证了同一个事务里,查询的结果都是事务开始时的状态(一致性)。但是,如果另一个事务同时提交了新数据,本事务再更新时,就会“惊奇的”发现了这些新数据,貌似之前读到的数据是“鬼影”一样的幻觉。
由ANSI/ISO定义的SQL-92标准定义的四种隔离级别:
-
1.Read Uncommitted
-
2.Read Committed
-
3.Repeatable Read
-
4.Serializable
-
READ UNCOMMITTED(未提交读),事务中的修改,即使没有提交,在其他事务也都是可见的。事务可以读取未提交的数据,这也被称为脏读。
-
READ COMMITTED(提交读),一个事务从开始直到提交之前,所做的任何修改对其他事务都是不可见的。这个级别有时候也叫做不可重复读,因为两次执行相同的查询,可能会得到不一样的结果。因为在这2次读之间可能有其他事务更改这个数据,每次读到的数据都是已经提交的。
-
REPEATABLE READ(可重复读),解决了脏读,也保证了在同一个事务中多次读取同样记录的结果是一致的。但是理论上,可重读读隔离级别还是无法解决另外一个幻读的问题,指的是当某个事务在读取某个范围内的记录时,另外一个事务也在该范围内插入了新的记录,当之前的事务再次读取该范围内的记录时,会产生幻行。
-
SERIALIZABLE(可串行化),它通过强制事务串行执行,避免了前面说的幻读的问题。
编程语言基础
- 类型检查
- 编译时:C,C++,Java,Go.…
- 运行时:Python,Perl,JavaScript,Ruby……
- 运行/编译
- 编译为机器代码运行:C,C++.…
- 编译为中间代码,在虚拟机运行:Java,C#…
- 解释执行:Python,Perl,JavaScript……
- 编程范式(Programming Paradigm)
- 面向过程:C,Visual Basic…
- 面向对象:Java,C#,C++,Scala.…
- 函数式:Haskell,Erlang…
解释:3个1是2的23-1 -23取反加一,0加31个1 加 1
计算机中的正数用源码表示,负数用补码表示,而负数的补码是其反码+1 所以出现了-128。简单的说为了避免-0,负数的算法结果是每位都加了1
采用补码表示负数.
1 1111111 表示-1
1 0000000 表示-128
浮点数与定点数
- 浮点数(+/-)1.xxx * 2^y
- 符号位|指数部分|基数部分
- 64位double范围:+/-10^308
- 64位double 精度:10^15
- 浮点数比较
- a==b?
- Math.abs(a-b)<eps ?
- 使用BigDecimal 算钱
装箱与拆箱
Java 数据类型
- primitive type vs Object
- primitive type:int,long,float……
- Object:Integer,Long,Float,String.…
- primitive type
- 值类型
- 用a==b判断相等
- object
- 引用类型
- 用a.equals(b),或Objects.equals(a,b)判断是否相等
- 用a==b判断是否为同一个Object
编码技巧
- 在白板上写程序
- 程序写在:白板,纸笔,Word文档,记事本。。。
- 修改不便;缩进不便;对齐困难
- 心里不抵触;先思考后写;不要惧怕修改/重写
- 数学归纳法公理
- 用于证明断言对所有自然数成立
- 证明对于N=1成立
- 证明N>1时:如果对于N-1成立,那么对于N成立
递归控制
- 递归书写方法
- 严格定义递归函数作用,包括参数,返回值,Side-effect
- 先一般,后特殊
- 每次调用必须缩小问题规模
- 每次问题规模缩小程度必须为1
链表创建
链表翻转
- Stack
- 函数调用开销
- Stack Overflow!
- 问题规模:n million 栈大小?
- 不要尝试递归,使用非递归
- 一般化的方法仍需使用栈
- 代码复杂
- 不根本解决问题
列出所有组合
- 循环书写方法
- 定义循环不变式,并在循环体每次结束后保持循环不变式
- 先一般,后特殊
- 每次必须向前推进循环不变式中涉及的变量值
- 每次推进的规模必须为1
微知识点
并行计算
- 将数据拆分到每个节点上 如何拆分
- 每个节点并行的计算出结果 什么结果
- 将结果汇总 如何汇总
- 如何排序10G个元素?
- 切分成多个段,每个段分配一个节点,所有节点进行归并,直到剩下一个节点
- 扩展的归并排序
多线程
- 保证线程安全性 加锁 当我们把锁的粒度放的过细,就会出现死锁的情况
- 确保同一个对象在同一时间只能有一个人
线程池
- 可以使用Future检查任务结果
- 创建线程开销大
- 线程池:预先建立好线程,等待任务派发
- 线程池的参数
- corePoolSize:线程池中初始线程数量,可能处于等待状态
- maximumPoglSize:线程池中最大允许线程数量
- keepAlive Time:超出corePoolSize部分线程如果等待这些时间将被回收
资源管理
- Java 垃圾回收
- 不被引用的对象会被回收
- 垃圾回收包括Minor GC和Full GC
- 垃圾回收时所有运行暂停
- Java资源管理
- 内存会被回收,资源不会被释放
- databaseConnection需要databaseConnection.close)来释放
try{
Database databaseConnection =connect(..);
databaseConnection.begin Transaction();
//do work
}catch(Exception e){
databaseConnection.rollBack);
}finally{
databaseConnection.close();/∥不要抛异常,最好加try/catch
}
- C++资源管理
- C++没有finally,没有try with resource
- C++有析构函数
void doWork){
Database databaseConnection(.…);
try{
databaseConnection.begin Transaction);
//do work
}catch(Exception&e){
databaseConnection.rollBack();
}
}
Database:~Database){
// close database connection
}
Beautiful Number
- 1,11,111…是beautiful的
- 3>2进制>11
- 13>3进制>111√
- 13>12进制>11x
- 13->3进制->111
- 133+1*3+1=13
- 13%3=1,13/3=4
- 4%3=1,4/3=1
- 1%3=1,1/-3=0
面试流程和技巧分享
- 自我介绍
- 破除陌生人紧张气氛
- 目的:破冰
- 结构化表达
共同学习,写下你的评论
评论加载中...
作者其他优质文章