(Toc generated by simple-php-github-toc )
每个节点最多有两个叶子节点。
左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
二叉查找树(Binary Search Tree),也称有序二叉树(ordered binary tree),排序二叉树(sorted binary tree)。
MySQL是基于B+树聚集索引组织表
LSM(Log-Structured Merge-Trees)和 B+ 树相比,是牺牲了部分读的性能来换取写的性能(通过批量写入),实现读写之间的。
Hbase、LevelDB、Tair(Long DB)、nessDB 采用 LSM 树的结构。LSM可以快速建立索引。
《LSM树(Log-Structured Merge Tree)存储引擎》
经常用于大规模数据的排重检查。
TODO
按照个位、十位、百位、…依次来排。
常用于大数据的排重,比如email,url 等。
核心原理:将每条数据通过计算产生一个指纹(一个字节或多个字节,但一定比原始数据要少很多),其中每一位都是通过随机计算获得,在将指纹映射到一个大的按位存储的空间中。注意:会有一定的错误率。
优点:空间和时间效率都很高。
缺点:随着存入的元素数量增加,误算率随之增加。
KPM:Knuth-Morris-Pratt算法(简称KMP)
核心原理是利用一个“部分匹配表”,跳过已经匹配过的元素。
序列化:所有事物串行处理(牺牲了效率)
公平锁的作用就是严格按照线程启动的顺序来执行的,不允许其他线程插队执行的;而非公平锁是允许插队的。
悲观锁如果使用不当(锁的条数过多),会引起服务大面积等待。推荐优先使用乐观锁+重试。
《Mysql查询语句使用select.. for update导致的数据库死锁分析》
由于高并发,在CAS下,更新后可能此A非彼A。通过版本号可以解决,类似于上文Mysql 中提到的的乐观锁。
可以对CopyOnWrite容器进行并发的读,而不需要加锁。CopyOnWrite并发容器用于读多写少的并发场景。比如白名单,黑名单,商品类目的访问和更新场景,不适合需要数据强一致性的场景。
《JAVA中写时复制(Copy-On-Write)Map实现》
《ReenTrantLock可重入锁(和synchronized的区别)总结》
互斥锁:同时只能有一个线程获得锁。比如,ReentrantLock 是互斥锁,ReadWriteLock 中的写锁是互斥锁。
共享锁:可以有多个线程同时或的锁。比如,Semaphore、CountDownLatch 是共享锁,ReadWriteLock 中的读锁是共享锁。
典型的 CPU 有三级缓存,举例核心越近,速度越快,空间越小。L1 一般 32k,L2 一般 256k,L3 一般12M。内存速度需要200个 CPU 周期,CPU 缓存需要1个CPU周期。
TODO
结构型模式:
创建模式:
TODO
命令行监控工具
APM — Application Performance Management
主要开源软件,按字母排序
开发、测试、生成环境分离。
《JBoss vs. Tomcat: Choosing A Java Application Server》
《memcache 中 add 、 set 、replace 的区别》
几种存储引擎:
《消息队列-推/拉模式学习 & ActiveMQ及JMS学习》
消息总线相当于在消息队列之上做了一层封装,统一入口,统一管控、简化接入成本。
支持事务,推拉模式都是支持、适合需要可靠性消息传输的场景。
Java实现,推拉模式都是支持,吞吐量逊于Kafka。可以保证消息顺序。
纯Java实现,兼容JMS,可以内嵌于Java应用中。
高吞吐量、采用拉模式。适合搞IO场景,比如日志同步。
生产者、消费者模式完全是客户端行为,list 和 拉模式实现,阻塞等待采用 blpop 指令。
TODO
SPI
TODO
服务端可以认证加密,在外网环境下,可以保证数据安全。
servlet 3.0 异步特性可用于配置中心的客户端
主要职责:请求转发、安全认证、协议转换、容灾。
《web优化必须了解的原理之I/o的五种模型和web的三种工作模式》
MyISAM 是非聚集,InnoDB 是聚集
例如:
256位的ECC秘钥的安全性等同于3072位的RSA秘钥。
TODO
TODO
在内外环境中通过跳板机登录到线上主机。
2FA - Two-factor authentication,用于加强登录验证
常用做法是 登录密码 + 手机验证码(或者令牌Key,类似于与网银的 USB key)
MyBatis:
TODO
Spring
Spring Boot
Spring Cloud
《Haproxy+Keepalived+MySQL实现读均衡负载》
limit_req
等模块限制并发连接数。平滑重启应用思路
1.端流量(如vip层)、2. flush 数据(如果有)、3, 重启应用
《JVM安全退出(如何优雅的关闭java服务)》
推荐推出方式:System.exit,Kill SIGTERM;不推荐 kill-9;用 Runtime.addShutdownHook 注册钩子。
《DRBD+Heartbeat+Mysql高可用读写分离架构》
《SpringCloud服务注册中心比较:Consul vs Zookeeper vs Etcd vs Eureka》
CQRS — Command Query Responsibility Seperation
《深度长文:我对CQRS/EventSourcing架构的思考》
TODO
TODO
TODO
TODO
TODO
TODO
TODO
制度还是制度!
另外,每个公司需要根据自己的需求和目标制定自己的 check list
SCRUM - 争球
TODO
XP - eXtreme Programming
4大价值:
5个原则:快速反馈、简单性假设、逐步修改、提倡更改(小步快跑)、优质工作(保证质量的前提下保证小步快跑)。
边写码,边review。能够增强代码质量、减少bug。
TODO
TODO
TODO
TODO
我国刑法第253条之一规定:
- 国家机关或者金融、电信、交通、教育、医疗等单位的工作人员,违反国家规定,将本单位在履行职责或者提供服务过程中获得的公民个人信息,出售或者非法提供给他人,情节严重的,处3年以下有期徒刑或者拘役,并处或者单处罚金。
- 窃取或者以其他方法非法获取上述信息,情节严重的,依照前款的规定处罚。
- 单位犯前两款罪的,对单位判处罚金,并对其直接负责的主管人员和其他直接责任人员,依照各该款的规定处罚。
最高人民法院、最高人民检察院关于执行《中华人民共和国刑法》确定罪名的补充规定(四)规定:触犯刑法第253条之一第1款之规定,构成“出售、非法提供公民个人信息罪”;触犯刑法第253条之一第2款之规定,构成“非法获取公民个人信息罪”
TODO
TODO
国内:
国外:
测试:
运维:
* [运维派](http://www.yunweipai.com/)
* [Abcdocker](https://www.abcdocker.com/)
Java:
安全
大数据
其他专题网站:
TODO
国内:
国外:
活动发布平台:
Awesome 系列虽然挺全,但基本只对收录的资源做了极为简要的介绍,如果有更详细的中文介绍,对相应开发者的帮助会更大。这也是我们发起这个开源项目的初衷。
维护者:tangyouhua
贡献者:tangyouhua、kingzone、llhua2329、BadCoderChou、anankun、贺贺、大彭、superXiaoFan、javayrf、John Smith、Jaler、JM、dreamkidd、cheenlie、zhangQian1991、王涛、马、vvkee、凝枫、haixunlu、milly、Hodur、FakeHank、连乐、UncleTim、sunbiaobiao、zhiguo、光光头去打酱油、云中游、Zemo、sdcuike、danielwii、oneDay、邢敏、heikehuan、fgcui1204、wenxueliu、Gentle Yang、黄小非、wangtg、百焱、胡不GUI、Another_mt、Rainbow、super^糖、黄余粮、Sun、You
注:名单不分排名,不定期补充更新
虽然奖励可能并不是你加入的主要原因,但还是有必要提一下:
这些工具伴随着Java一起出现,在各自辉煌之后还在一直使用。
构建及应用依赖关系处理工具。
编程方式操作字节码的开发库。
在集群内动态管理应用程序的框架。
测量代码指标和质量工具。
用来创建解析器、解释器或编译器的框架。
支持外部配置的开发库。
帮助解决约束满足问题的开发库。
简化CSV数据读写的框架与开发库
简化数据库交互的相关工具。
处理时间和日期的开发库。
帮实现依赖翻转范式的开发库。 官网
从最基本的层面增强开发流程。
用来编写分布式容错应用的开发库和框架。
对应用程序而言,在分布式系统中的数据库看起来就像是只有一个数据源。
以本机格式发布应用程序的工具。
处理Office文档的开发库。
函数式编程支持库。
游戏开发框架。
现代图形化用户界面开发库。
涵盖了从集合到特定开发库的高性能计算相关工具。
简化开发的集成开发环境。
创建、评价和操作图片的支持库。
简化JSON处理的开发库。
目前的JVM和JDK实现。
除Java外,可以用来编写JVM应用程序的编程语言。
记录应用程序行为日志的开发库。
提供具体统计算法的工具。其算法可从数据中学习。
在客户端之间进行消息传递,确保协议独立性的工具。
未分类其它资源。
监控生产环境中应用程序的工具。
用来进行特定平台开发的原生开发库。
用来专门处理文本的函数库。
网络编程函数库。
处理对象持久化的API。
用来帮助创建PDF文件的资源。
性能分析、性能剖析及基准测试工具。
用来开发响应式应用程序的开发库。
用来创建RESTful 服务的框架。
用于科学计算和分析的函数库。
文档索引引擎,用于搜索和分析。
用于处理安全、认证、授权或会话管理的函数库。
用来高效处理序列化的函数库。
用来部署应用程序的服务器。
在模板中替换表达式的工具。
测试内容从对象到接口,涵盖性能测试和基准测试工具。
通用工具类函数库。
用于分析网站内容的函数库。
用于处理Web应用程序不同层次间通讯的框架。
流程驱动的软件系统构建。
具有广泛影响且值得阅读的Java经典书籍。
可以一边编程一边听的东西。
值得关注的Java技术站点。
论文投稿接近尾声,每个人都在为了自己的未来而努力方向明确了,但是早已疲惫不堪,特别看了师弟面经感触颇深!
很久没有出去锻炼了,也没有出去娱乐了,等过了这段时间再重回正常的生活!
目标很明确,执行力不够,效率不高!
1 逻辑回归部分
常问,推导要会
推导:https://zhuanlan.zhihu.com/p/34325602
2 SVM部分
常问,推导要会,精简版看下面链接,但是写的不是很详细,最好把cs229讲义好好看看
推导:https://www.zhihu.com/question/21094489 @靠靠靠谱 的回答
3 集成学习
常问,推导要会
bagging方法:看周志华教授的西瓜书
boosting方法:看李航的蓝书,特别的对于GBDT,这篇文章写的很清晰,推导相对简单
这里注意一下,GBDT有两种,一种是残差学习,一种是负梯度代替残差的版本(所以有个G啊),为啥用负梯度近似残差也是常问的,其实这个说法就不对,残差只是在loss用最小二乘时候的一个特例,对求梯度刚好就是,换成其他loss function就不对了,所以应该反过来说,残差学习只是一个特例,负梯度才是通用的
stacking方法:没有特别好的讲解,都看看吧,这篇还行
决策树:cart树是最常问的,详见李航蓝书,从推导到剪枝都要会
4 softmax
这个相对简单,这篇足够了
5 牛顿法和梯度下降
推导以及优劣比较,相对简单,直接看cs229讲义
6 交叉验证
相对简单,看这篇
7 正则方法
正则是一大块,原理方法都要懂,可以参考这些文章 :1 2
8 归一化方法
基础问题,随便那本书都有
9 SVD分解 PCA ICA 白化
这部分我没有被问到,但是应该会问,毕竟是重点,看cs229讲义
1 过拟合的起因,怎么解决
这个没啥好说的,任何讲深度学习的书和课程都有,看哪个都行
2 batch normalization
这个问题下的回答很有价值
3 cnn rnn本质
这篇文章总结的很好
4 梯度弥散/爆炸
没有太好的文章,看看这篇讲resnet的吧
5 激活函数,比较
sigmod tanh relu maxout… 好多,这个随便一搜就一堆,放一个不太切题的文章吧,我偶像何之源奆佬的回答,手动滑稽
6 梯度下降优化
这就很多了,lan大神的花书讲的就很好,博客也可以看这个
7 各种网络结构
这个就太多了,cnn的 rnn的,细分还有很多,多看多熟悉吧
很奇怪,反而这块很不重视,考的题都很简单
1 阿里在线编程测试
给一个圆,切成n个扇形,涂m种颜色,要求任意两个相邻扇形颜色不同
思路:首先不考虑首尾位置的扇形是否颜色相同,那么总共是 种,
此时两种情况:1)首尾位置扇形颜色相同 2)首尾位置扇形颜色不同,第二种满足题意,不管,第一种可以把首尾颜色相同的扇形合成一个扇形,这样就成了一个相同要求但是规模是的问题,这样递推公式就是 ,
2 腾讯二面 面试官随手问的一个问题
是分水岭算法的一部分,问题可以如下描述:假设有一个单通道图片,背景像素点值为0,中间的物体像素点值为1,求出所有物体像素点到背景的最短距离
思路:dp思想,查看邻点,如果有一个是0,那么距离为1,否则该点的距离是邻点中最短的距离+1,先扫描行,只关心行的不关心列,算出最短距离,再扫描列,只关心列不关心行,更新上一步扫描行后的结果,就是EDT算法,如果是欧式距离还要扫描斜边
3 腾讯二三面之间的笔试题
有n堆石子,第i堆石子的重量是w[i],每次合并两堆石子,并计算分数,比如,两堆石子是x,y,合并后是x+y 分数是xy,一直合并下去,直到只剩一堆石子,求最大累积分数
思路: 一眼看到合并就是哈夫曼树呗,区别就是哈夫曼树分数是x+y,这个是x 一眼看到合并就是哈夫曼树呗,区别就是哈夫曼树分数是x+y,这个是x*y,那么每次取两个最大就行了,优先队列,弹出两个最大的相加计算乘积分数,然后结果扔进队列,直到队列只剩一个元素
这部分只被问了这一个问题
1 Sobel、canny 算子 边缘检测算子看这个
信息熵、条件熵、互信息、信息增益 等等的计算,腾讯现场笔试考的,具体的题忘了。。。
1 概率分布的相关计算
2 假设检验
这部分看看本科的课本吧,都有的,概率论的题考的比较活
]]>找工作是应试,要确定目标,找准重点。如果面试总是失败,那原因一般都是目标定高了。准备实习不要用很厚很厚的手册书,除非你之前已经通读过一遍,这点很重要,否则你将会浪费大量时间。别人经验贴里所列参考书籍绝不是短短一两个月看完的,如果以前没看过,请不要盲从。
现在可以开始投简历了,但如果你从来没有面试过,还是先投比理想公司简单一些的。目标是阿里,腾讯,谷歌等,现在可以投滴滴,美团,百度等。积累面试经验。至于是否需要笔试一般取决于简历的好坏,如果他们觉得你的简历不错,通常直接就开始面试了。投递和面试确实都是有记录的,虽然像腾讯等往往会有多次面试机会,但还是先练级吧。
有一个小技巧大家可以试试,对我去年帮助很大。将你的手机开启通话录音,这样所有电话面试都会被记录下来,面试完务必把题目都记下来解决掉,经过三四次电话面之后你会发现重复率原来这么高,这些都是属于你自己自主学习总结的,比看经验贴有效得多。
不要总是忙着刷题和看书,作用是有的,但收益很小。对刚开始找工作的大家而言,收益最大的是:准备个5分钟的自我介绍(姓名,学校,学历,毕业时间,实习经历,项目经历,竞赛经历,可实习时间;不要描述细节,但要说清楚是什么,有什么,自我介绍有可能被打断,重点前面说);对简历上的项目用到的技术深入了解,思考以下哪里还可以改进?哪里可能会出现问题?
有些是需要远程或当面写代码的,核心代码往往在25行左右,如果你写得太长很有可能是因为:STL或语言自带库函数不熟悉;数据结构选择不当;题意不清。至于红黑树、B树这些,了解基本定义并做一些相应选择题即可,不要去看代码,除非你真的准备很充足,时间很充裕。动态规划类题目做几个最经典的即可,不会拉倒,不要有包袱。
关于项目,能力很强的同学这个应该不需要看。但对于目前简历上还憋不出一个项目的同学来说,面试确实很尴尬,从简历完整度来说,你的实习经历(可以理解为一段实习一个项目) + 个人项目 < 3时,面试因为不再有这些弹性内容暖场,很有可能上来直接问基础知识。因此,你如果想避开被知识点疯狂轰炸,现在就去实习!说句题外话,我也曾帮助别人面试过,你简历上既没有个人项目也没有实习经历的话,其实面试官比你还尴尬……
关于导师,如果导师实在不给出去实习的话,那就静下心好好弄论文,在找工作时,一篇高质量论文对找工作帮助极大!当然,注意前提,是高质量论文。如果导师不放行又只能写很水论文的话,赶紧自己动手做一些小项目。这些项目推荐APP或者网页能直接用的,链接附在简历上,面试官一定会看的。而且这种表现形式比那种描述项目经历时在简历上堆砌一大堆技术名词靠谱多了。
关于简历。对大部分人而言用网上的模板就足够了,如果非要不一样的话,请上GitHub搜索Resume,会有一堆LaTeX模板。记住,你的时间不多,请不要花太多时间折腾LateX,直接用别人模板,用起来和写前端差不多。有几点需要单独提一下:简历请转成pdf格式再投递;请写Java而不是java,写C++而不是c++,Python而不是python;简历要包含教育经历、获奖情况、实习经历、项目经验,其他的按简历留白大小自加;千万不要在项目经历中堆砌技术名词,你要对你写的每个字负责。
关于笔试。之前都在说面试的事,学校不错且简历还行的话往往可以直接面试,但如果不是学校很好的话,肯定要通过笔试才能面试。笔试的话,选择题只需要刷牛客就行!编程题其实难度要大于面试手写的代码,这点需要注意。
有别的想到的,我还会继续追加。去年经历过各种大厂、小厂面试,也帮助他们面试过别人,以上均为经验之谈。以下链接是我去年复习时整理的一些知识点,希望对大家有所帮助:https://github.com/linw7/Skill-Tree
总有人可以把LeetCode刷上几遍,总有人看过很多遍《C++ Primer》。但用最少的功夫和他们拿到同样好的offer,那才是大智慧,加油~
]]> 近期学习,兜兜转转依然绕不开本科学的基础课程(数据结构、操作系统、计算机网络、数据库等),无论你是做服务器端还是客户端都会面临这些问题!现在大数据、云计算、人工智能(机器学习)、物联网、区块链等遍地开花,每个人都想做出自己的一番成就,近期来实验室的师弟师妹们大部分人都想未来研究机器学习的方向,可是当我问他们基础算法学的怎么样,他们的回答让我很失望!我们都走到一个怪圈里面,每个人都想研究最前沿的东西,却也迷失了自己!刚刚也看了牛客的直播,在涉及所学内容的深度和广度的问题各执己见!
总结下来自己以前的学习方法,都是广而不精!读研期间我接触大数据与机器学习等,每个方向都有几个月的学习,很多都是浅尝辄止!记得以前和工作的同学交流,他们说找工作只要会一项很强的本领就足以让你站稳脚跟,同时本科老师也教导我们不必要追寻最新的技术,因为我们每次都想追上潮流,却发现新的技术已经替代了老的技术!拿java来说,在我读本科的时候,框架SSH和android、大数据比较流行,基本学个皮毛都可以找到薪水比较不错的工作,但是当我本科毕业后同班同学出去找工作却没有那么大的优势,他们的待遇都是一般般!无独有偶,一位专注于自己喜爱的领域(安全领域)的同学,在找工作和待遇方面确是那么有优势!这个社会需要全才,但不是每个人都能成为全才!对于绝大数的本科、研究生来说都只能研究一个方向,这也应征了学历越高研究的领域越来越窄!
由于本人还没有工作,这里只能借助牛客网直播远景能源的大佬的经验。
工作中都会碰到具体的业务,大数据解决了数据管理的问题,这就要我们思考它是如何管理的,这样带着问题驱动去看一门技术,学习才会更加明白!在学习的广度和深度上面他没有给出确切的回答,但是我个人偏向于精度,就如同高手只需要一门看家本领就足以傲视群雄,就如同郭靖唯一看家本领降龙十八掌!另外谈论一个基础知识和框架学习和源码,二者需要兼顾,基础知识融入以后的工作当中,机器学习的一系列算法既需要很深的数学功底,也需要对计算机基础知识了解的通透,我个人觉得我数学知识不够扎实,所以在机器学习领域也仅仅停留在用的基础上(比如调调包、导库等)!这也是我实习不敢找机器学习工程师的原因,你做的工作大部分人能做,那就不是你的优势!真正的大神都会对源码比较了解,直播中提到了对jdk、jvm、linux等源码的阅读,主要对用的较多类和文件进行阅读,一方面我们没有那么多的精力,另一方面我们目前泛读只会领悟的不深!
算起来今天一次,一共进行了三次面试,两次电话面试和一次现场面试!总的来说都是对基础课程的考察,由于刚刚要毕业的大学生大部分没啥好的项目,就算有也是对大佬来说是皮毛!语言作为开发人员的工具,面试官也会问你的语言的底层实现和语言所依赖的东西(比如jvm),最后记一下今天面试的问题:说一下从客户端发起请求到服务器端做出回应所做的一系列操作,越详细越好!(ps:回答穿插整个基础知识、语言等)我也是佩服这个面试官,一个问题问出了所有!
网易的题还是有技术含量的,二分和数学和优美暴力考察得较多,这些东西在工作中确实很重要,都是优化程序的方法。
为了找到自己满意的工作,牛牛收集了每种工作的难度和报酬。牛牛选工作的标准是在难度不超过自身能力值的情况下,牛牛选择报酬最高的工作。在牛牛选定了自己的工作后,牛牛的小伙伴们来找牛牛帮忙选工作,牛牛依然使用自己的标准来帮助小伙伴们。牛牛的小伙伴太多了,于是他只好把这个任务交给了你。
每个输入包含一个测试用例。
每个测试用例的第一行包含两个正整数,分别表示工作的数量$N(N\le100000)$和小伙伴的数量$M(M\le100000)$。
接下来的N
行每行包含两个正整数,分别表示该项工作的难度$D_i(D_i\le1000000000)$和报酬$P_i(P_i\le1000000000)$。
接下来的一行包含M
个正整数,分别表示M
个小伙伴的能力值$A_i(A_i\le1000000000)$。
保证不存在两项工作的报酬相同。
对于每个小伙伴,在单独的一行输出一个正整数表示他能得到的最高报酬。一个工作可以被多个人选择。
in: 3 3 1 100 10 1000 1000000000 1001 9 10 1000000000 out: 100 1000 1001
N, M
都达到了$10^5$,很明显,对于每次询问要采用$O(logn)$或$O(1)$的算法,$O(logn)$可以二分查找,$O(1)$可以通过预处理来达到目标。
因此,先按每个工作的能力值升序排序,这样子可以二分查找到每个同学能做的所有工作,然后再这些工作中找到薪酬最大的;
如何快速找薪酬最大的,这里就要对刚刚升序排序的输出进行区间最大值的预处理了,递推一下就可以得到[1, i]
区间的最大值,找区间薪酬最大,只需要访问下dp[i]
就行了。
|
|
小Q得到一个神奇的数列:
1, 12, 123,...12345678910,1234567891011...
。
并且小Q对于能否被3
整除这个性质很感兴趣。
小Q现在希望你能帮他计算一下从数列的第l
个到第r
个(包含端点)有多少个数可以被3
整除。
输入包括两个整数
l
和r
$(1 <= l <= r <= 10^9)$, 表示要求解的区间两端。
输出一个整数, 表示区间内能被3整除的数字个数。
in: 2 5 out: 3
看到数据范围就应该明白,这题不能递推,一是数组开不了这么大,二是递推时间很长。因此只能用数学方法算出来(这就是数据范围给我们做题的提示)。
一个数字n
如果可以被3
整除,$n = a 10^n + b$,那么$a \% 3 + b \% 3 = 0$,1, 2, 3, 4, ...
分别对3取模得到1, 2, 0, 1, 2, 0, ...
,这个时候再看题中给出的序列,1, 12, 123, 1234, ...
是不是可以把其中元素分解成$n = a 10^n + b$,那么可以发现,1, 12, 123, 1234, 12345, ...
,能被3整除的如下false, true, true, false, true, true, false, ...
,可以发现这个序列以3
为周期,因此,代码就可以写出来了。
|
|
小Q正在给一条长度为
n
的道路设计路灯安置方案。
为了让问题更简单,小Q把道路视为n
个方格,需要照亮的地方用'.'
表示, 不需要照亮的障碍物格子用'X'
表示。
小Q现在要在道路上设置一些路灯, 对于安置在pos
位置的路灯, 这盏路灯可以照亮pos - 1, pos, pos + 1
这三个位置。
小Q希望能安置尽量少的路灯照亮所有'.'
区域, 希望你能帮他计算一下最少需要多少盏路灯。
输入的第一行包含一个正整数
t
$(1 \le t \le 1000)$, 表示测试用例数
接下来每两行一个测试数据, 第一行一个正整数n
$(1 \le n \le 1000)$,表示道路的长度。
第二行一个字符串s
表示道路的构造,只包含'.'
和'X'
。
对于每个测试用例, 输出一个正整数表示最少需要多少盏路灯。
in: 2 3 .X. 11 ...XX....XX out: 1 3
一开始,我以为障碍物是不能放灯的,故,只要求出连续的.
有多少个.
(假设sum
个),答案就是ceil(sum / 3)
,于是写出了下面的代码;
|
|
这个题,障碍物是可以放灯的,那么,贪心来搞,首先,对于...
来说,我们把灯放在第二个位置上是绝对优于把灯放在第一个位置上的,如果发现当前点是障碍物,不要管它,继续向后走,然后按找上面所说的放灯就行了。
|
|
牛牛以前在老师那里得到了一个正整数数对
(x, y)
, 牛牛忘记他们具体是多少了。
但是牛牛记得老师告诉过他x
和y
均不大于n
, 并且x
除以y
的余数大于等于k
。
牛牛希望你能帮他计算一共有多少个可能的数对。
输入包括两个正整数
n,k
$(1 \le n \le 10^5, 0 \le k \le n - 1)$。
对于每个测试用例, 输出一个正整数表示可能的数对数量。
in: 5 2 out: 7
这里我们从k + 1
枚举y
到n
,对于一个确定的y
,x % y
的值的大小是有周期性的,因此可以直接计算出来,但是对于k = 0
要特殊处理,因为对于任意的(x, y)
,x % y
永远大于等于0,因此,当k = 0
时,答案为n * n
。
|
|
平面内有
n
个矩形, 第i
个矩形的左下角坐标为$(x1[i], y1[i])$, 右上角坐标为$(x2[i], y2[i])$。
如果两个或者多个矩形有公共区域则认为它们是相互重叠的(不考虑边界和角落)。
请你计算出平面内重叠矩形数量最多的地方,有多少个矩形相互重叠。
输入包括五行。
第一行包括一个整数n
$(2 \le n \le 50)$, 表示矩形的个数。
第二行包括n
个整数$x_1i$,表示左下角的横坐标。
第三行包括n
个整数$y_1i$,表示左下角的纵坐标。
第四行包括n
个整数$x_2i$,表示右上角的横坐标。
第五行包括n
个整数$y_2i$,表示右上角的纵坐标。
输出一个正整数, 表示最多的地方有多少个矩形相互重叠,如果矩形都不互相重叠,输出1。
in: 2 0 90 0 90 100 200 100 200 out: 2
这个题和线段重叠那个题很像,但是多了一维就不是那么好搞了,这里的n
很小,那么肯定就是从这里下手了;
我的第一反应就是随机化算法,即随机生成一个点,然后判断这个点在多少个矩形中,维护一个最大值。但是坐标的范围太大了,因此,要进行离散化,把X轴和Y轴的坐标离散化成小坐标;
但是,这个离散化算法还是有问题,无法处理两个矩形共线或共点!多么希望我们随机化出来的点不在矩形的边界上啊;
注意到,我们离散化出来的坐标都是挨在一起的,例如1
后面一定是2
,但是如果我们把离散化后的坐标扩大两倍,那么2
后面就是4
了,中间的3
是没有使用的,而单位区域的中心是不会在矩形的边界上的,因此我们可以随机化单位区域的中心,以这个点去判断是否在矩形中,这样就解决了不考虑边界和角落这个条件,而把离散化后的坐标扩大两倍,举个例子,中心就是(2 + 4) / 2 = 3
,中心可以确保都是正整数。
|
|
牛牛去犇犇老师家补课,出门的时候面向北方,但是现在他迷路了。虽然他手里有一张地图,但是他需要知道自己面向哪个方向,请你帮帮他。
每个输入包含一个测试用例。
每个测试用例的第一行包含一个正整数,表示转方向的次数N
$(N\le1000)$。
接下来的一行包含一个长度为N
的字符串,由L
和R
组成,L
表示向左转,R
表示向右转。
输出牛牛最后面向的方向,
N
表示北,S
表示南,E
表示东,W
表示西。
in: 3 LRR out: E
如图:
把NESW
用数字0123
表示,向左走就减一,向右走就加一,由于在处理的过程中ans
可能为负数,因此对ans
加4
再模4
。
|
|
牛牛总是睡过头,所以他定了很多闹钟,只有在闹钟响的时候他才会醒过来并且决定起不起床。从他起床算起他需要
X
分钟到达教室,上课时间为当天的A
时B
分,请问他最晚可以什么时间起床
每个输入包含一个测试用例。
每个测试用例的第一行包含一个正整数,表示闹钟的数量N
$(N\le100)$。
接下来的N
行每行包含两个整数,表示这个闹钟响起的时间为$H_i(0\le A<24)时M_i(0\le B<60)$分。
接下来的一行包含一个整数,表示从起床算起他需要$X(0\le X\le100)$分钟到达教室。
接下来的一行包含两个整数,表示上课时间为$A(0\le A<24)$时$B(0\le B<60)$分。
数据保证至少有一个闹钟可以让牛牛及时到达教室。
输出两个整数表示牛牛最晚起床时间。
in: 3 5 0 6 0 7 0 59 6 59 out: 6 0
把时间全都化成分钟,然后算出牛牛最迟起床时间,在闹钟的时间中二分求上界就行了。
|
|
牛牛准备参加学校组织的春游, 出发前牛牛准备往背包里装入一些零食, 牛牛的背包容量为
w
。
牛牛家里一共有n
袋零食, 第i
袋零食体积为v[i]
。
牛牛想知道在总体积不超过背包容量的情况下,他一共有多少种零食放法(总体积为0
也算一种放法)。
输入包括两行
第一行为两个正整数n
和w
$(1 \le n \le 30, 1 \le w \le 2 * 10^9)$,表示零食的数量和背包的容量。
第二行n
个正整数v[i]
$(0 \le v[i] \le 10^9)$,表示每袋零食的体积。
输出一个正整数, 表示牛牛一共有多少种零食放法。
in: 3 10 1 2 4 out: 8
一看就是最经典“0 - 1背包问题“,但是,背包的容量太大了,会导致数组都开不了,而且还超时。
那么,就枚举呗,枚举使用二进制位运算枚举集合,就写了以下的代码:
|
|
写完之后才意识到$2^{30} \approx 10^9 $,GG,这肯定不行,不过枚举还是必要的,毕竟不能动态规划了,那就少枚举点吧,枚举一半,一半是$2^{15} \approx 10^5$,好像可以,那另一半怎么办,我们可以把第一半枚举出来的和存到数组arr
中,然后排序,这样,在枚举另一半的时候可以通过w
减去枚举得到的值,结果假设为res
,最后利用这个res
在arr
中二分求上界就可以得到当前状态的答案,维护一个和,这个题就通过了。
|
|
JAVA的代码和C++的代码差不多,最大的区别就是JAVA中没有lower_bound
,upper_bound
,这是STL中的两个二分求上下界函数,自己手动实现一下就好了,可以参考你真的理解二分的写法吗 - 二分写法详解。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
同时,也是因为在GIAC的大会被问到,程序员老了怎么办?而在年底这段时间,也和几个朋友在交流中不断地重复谈到个人发展的这个话题。我的人生过半,活到“不惑”的年纪,自然经常性的对什么事都会回头看看总结归纳,所以,在交谈过程中和交谈过后,自己也有一些思考想记录下来。因为我本人也是在这条路上的人,所以,谈不上给他人指导,我同样也是在瞎乱折腾同样每天在思考自己要去哪儿的“一尘世间迷途老生”。况且,我的经历和眼界非常有限,因此,下面的这些关于个人发展的文字和思考必然是受我的眼界和经历所局限的。也欢迎大家补充和指正。
这些东西不一定对,也不一定就是全部,期许可以让你在年底的时候有所思考,在明年的时候有所计划。
一个重要阶段和标志
在讲个人发展之前,我需要先说一下人生中的一个非常重要的阶段——20到30岁!
这个阶段的首要任务,就是提升自己学习能力和解决难题的能力。这是一个非常非常关键的时间段!这个时间段几乎决定着你的未来。
30岁以前,这个时间段,应该是人学习和积累的时间段,这个时间段,就是努力学习的时间段。这个时间段,你一定要把时间花在解决问题的技能上。就是说,你一定要练就成的技能是——你能解决大多数人不能解决的问题。使蛮力埋头加班苦干,当一个搬砖老黄牛的是肯定没有前途的。如果你不幸呆在了一个搬砖的地方,天天被业务压得喘不过气来,我建议你宁可让你的项目延期被老板骂,也要把时间挤出来努力学习基础知识,多掌握一些技术(很多技术在思路上是相通的),然后才能有机会改变自己目前的状况。因为,比起你的个人未来,项目延期被老板骂、绩效不好拿不到奖金,都不是什么事儿。
总结一下,你在30岁前,工作5-7年,你需要拥有:
高效的学习能力。这意味着——基础知识扎实、触类旁通、读英文文档不费劲、有寻找前沿知识的能力、能够看到问题和技术的本质、善于思辩、能独立思考。
解决问题的能力。这意味着——你要高效的学习能力、见过很多的场景、犯过或是处理很多错误、能够防火而不是救火。
如果你拥有这两个能力的现象是—— 在团队或身边的人群中的显现出Leadership。
Leadership并不是当领导和经理,而是一种特征,这种特征有如下两个简单的表象:
帮人解问题。团队或身边中大多数人都在问:“这问题怎么办?”,而总是你能站出来告诉大家这事该怎么办?
被人所依赖。团队或身边中大多数人在做比较关键的决定时,都会来找你咨询你的意见和想法。
一但你在在30岁之间出现了Leadership这样的特征,那么,你会进入一个正循环的阶段:
因为你学习能力强,所以,你会有更多的机会解决难题。
你有更多的机会解决难题,你就会学更多的东西,于是你就会更强。
上面这个循环,只要循环上几年,就会让你人生的各种可能性大大的增加。
【 注意 】
要达到这样的特质,需要找到自己的长处、以及适合自己的环境。就像鱼的特长是呆在水里,让鱼儿去追求陆上动物的刺激生活并不靠谱。
一般说来,有这样的潜质的人,在学校中就应该要出现。如果你在大学中还没有出现这样的潜质,那么,你在工作当中要加倍努力了(注:所谓的加倍努力,不是让你使蛮力加班,而是让你多学习成长,使蛮力拼命是弥补不了能力、思维、眼界上的缺陷的)。
Leadership也有范围的,比如,身边的朋友,工作中的团队/部分,圈内,整个行业。Leadership的范围越大,你的个人发展的选择性就越高。反之则越小。
如果已到了30岁左右,还是没有出现这样的特征。那么,可能未来你也很难有这样的Leadership了。而你的个人发展的可能性可能也就不多了(sigh…)
读到这里,我必需要说一下,如果你已开始显现出你的Leadership,那么你才谈得上个人发展,这篇文章后续的内容也可能才会对你有意义。
个人发展的三个方向
以我个人短浅的经历和视野,目前只看到的人的发展有如下三个大方向(他们之间可能会有重叠):
1)在职场中打拼
2)去经历有意义有价值的事
3)追求一种自由的生活
这三个方向,我个人或多或少都体验过,我也见过身边的很多人走这三个方向走的比较成功。也许还有别的方向,没办法,现在,我的视野就这么大,所以,我在这里,我主要就是谈谈这三个方向。Again,人有资格去走这三个方向的前提是——已有了上面我说的Leadership那种特质!
在职场中发展应该是绝大多数人的选择。通过加入公司来达到人生的发展。
我们经常可以看到很多所谓的“职业规划”,但是大多数职业规划只不过人力资源搞出来的东西,和实际其实是有很大出入的。我的人生经历中,有18年左右是在公司中度过的,在过银行,小公司,大公司,民营公司,外国公司,传统IT公司,互联网公司,不同的公司完全有不同的玩法和文化,我的经历还算丰富,但也不算特别成功,这里只分享一些我在职场中的心得(不一定对,仅供参考)。
去顶尖公司的一个目的就是让你的Leadership的范围的可能性扩大。
因为公司和公司的差距也不小,所以,就算你在低端公司里是骨干份子,但在高端公司里可能只是一个普通员工(就像中国足球队的主力到了英超可能都无法入选)。所以,在职场中,如果你要让你的个人价值最大化的话,你一定要去顶尖的公司。因为顶尖公司里有非常不错的工作方法和场景,这并不是能看书或是交流得来的,这是必需要去亲身体验的。所以说,在顶尖公司掌握的技能,开阔的眼界,通常来说都会比低端公司的要多得多。
另外,每个公司的工作级别都是有相互对标的,比如:阿里的P几对应于百度的T几。国内的一线公司职位还相当,但是如果和国外一线公司的比,那就有差距了,而且差距还很大。比如,Google或Facebook的某个高级工程师,可能就对应于阿里的P8/P9甚至更高。
是的,对于职场来说,如果你在顶尖公司是骨干,那么,你去低端公司,则有很大机会会成为他们高管和核心。就好像你在Facebook里干三五年成为他们的技术骨干,那么你到BAT去成成为高管概率是非常大的。反过来,如果你毕业主去了BAT成为了一个螺丝钉,在天天加班中度过你的青春,你干个十年能成为BAT的高管的概率可能会非常的低。
去顶尖公司和去创业公司在某些时候并不冲突。不过,这里我想讲的是,一个技术能力强的人在大公司可能会被埋没掉。因为大公司业务成功后,
成功的公司在招聘各种高级技术人才都不会成为问题,于是少你一个不少,多你一个不多。
成功的公司其整个技术体系已经完成,Legacy的问题也比较多,所以,可以供你发挥的余地不大。
成功的公司更多的可能会想要稳定的系统,稳定必然会产生保守,而保守则产生不思进取。
所以,对于中高级人才来说,在大公司里的能产生的个人价值,可能远远不如那些求贤若渴、没有包袱、可以尽情施展、相对更为灵活和自由的创业型公司。
不过,去创业公司需要小心仔细的挑选和评估,创业公司的不确定因素很多,也和创始人的因素太大了,所以,你需要小心了解创始人和他们的业务情况,想法和理念差不多才能更好的共事。
好多创业公司其实并不是真正的创业公司,他们创业有很大的侥幸和驱利心理,要小心甄别。因为那不是真正的创业公司。
首先,有一个不争事实——整个社会是会把最重要的工作交给30岁左右的这群人的。也就是说,30岁左右这群人是这个社会的做事的中坚力量。
所以,这是一个机遇!如果你有了Leadership,你就一定能在这个时间段内赶得上这个机遇——公司和领导对你寄于信任和厚望,并把重要的团队和工作交给你。
于是,你的30岁到40岁就成了一个职业生涯的发展期,也就是你的事业上升期。如果你到40岁都没有赶上,那么你的职业生涯也就这样了,老有所成的人是少数。
在你事业的上升期,你需要更多的软技能,比如:
带领产品和业务的发展的能力
推行自己喜欢的文化的能力
项目管理的能力——在任务重、时间紧中求全
沟通和说服别人的能力
解决冲突的能力
管理和发展团队的能力
解决突发事件的应急能力
…… ……
另外,你还要明白在职场里的几个冷酷的事实:
你开始要关心并处理复杂的人事。尤其在大公司,大量的人都是屁股决定脑袋,利益关系复杂,目标不一致,每个人心里都有不一样的想法。这个时候再也不是talk is cheap, show me the code!而是,code is cheap,talk is the matter。你需要花大量的时间去思考和观察形形色色的人。需要耗费大量的精力在不同的人之间周旋,而不是花时间去创造些什么有价值的东西。
你要开始学会使用各种政治手段。办公室政治不可避免,越大的公司越重,自从你开始成为一线的leader的那一天起,你就开始成为“里外不是人”的角色,需要在下属和领导,员工和公司之间周旋。随而你的级别越来越高,你需要使用更多的政治手段,你会学会审时度世的站队,学会迎合员工和领导,学会用官员的语言说话,学会此一时彼一时,学会妥协和交换,学会忍气吞声,学会在在适当的时机表现自己,学会波澜不惊,学会把自己隐藏起来,甚至你还会迷失自我,开始学会一些厚黑学,比如不得不在适当的时机在背后捅人刀子……你可能会成为一个你自己都讨厌的人
听上去真的好无聊,所以,你现在也明白为什么高层们都看上去很忙很累,而且抽不出时间来关心细节问题,因为,他们更多的是要协调整个组织和系统来运转,甚至还要四处周旋,各种博弈,没办法,这是职场的必需的东西!听起来是不是感觉人类很愚蠢?这真是没办法的事。如果你不想或是也没有能力玩这些东西,那么你需要去那些可以让技术人员安安心心做技术的公司。这类的公司,我见过Microsoft、Google、Amazon或是一些创业公司里都有。国内的大公司中也有让技术人员成长的职业成长线,但老实说,表面上看似是一个让人专心做技术的升职成长线,但其实还是管理岗位。
所以,技术人员在职场中的归宿有两条路 —— 到真正的技术公司成为一个专心做技术的人,或是在成为一个职业的经理人。
先说三个故事,
第一个,是在阿里的时候,有一天在内网里看到一个贴子,一个做产品的女孩说自己准备离职要去法国学烘培厨艺,引得大家热评。
第二个,是在亚马逊的美国老板,他每年都要去报个培训班学一个技能,比如:厨艺、开双翼飞机、夜总会里的DJ……、甚至去华盛顿去学当一个政客。
第三个,是在汤森路透工作时,一个英国的同事,有一天他说他离职了,和自己的老婆准备用余生去周游世界,我问他是不是有足够多的钱了?他和我说,钱不够,他俩口子的计划是,边旅游边打工,打工打够到下一站的钱就走。他还说,那种用假期去另一个城市的旅游太没意思了,如果你不在那个地方生活上一段时间 ,你怎么能算是好的旅游体验呢?好吧,无法反驳。
我是觉得他们把自己的人生过得如此有意思,令我很佩服。虽然跨界跨得有点猛,但是 Why Not?
在这里,我想说,去追求一种和众人不一样的人生经历也是一件挺好的事,我个人感觉,比起在职场里有趣地多多了。如果你厌倦了职场,其实为什么不去追求一下不同的人生经历呢。就算你不想去追求跨度比较大的人生经历,那么,在技术圈里,也有很多有价值有意思的经历也可以去的。追求刺激有意义的与众不同的经历的人,其实也能算是一种人生的成功,不是吗?
如果只说技术方面,我个人看到的去追求经历的人,有两种追求的人其实也很成功的:
到技术创新的发源地去经历创新。计算机互联网各种技术的创新引擎,基本上来说,就是在美国了。我们赶上了这个时代,也选对了这个时代最火热的行业,那么,有什么理由不去这个时代的技术发动机那里去经历呢?在美国硅谷湾区,无论是大公司,还是创业公司,都在迸发着各式各样的创新,如果有能力有机会,为什么不努力去经历一下呢?不经历一下,老了不会觉得错过了是一种后悔吗?
去经历下一个热点技术的发展。从IT,到互联网、再到移动互联网、云计算、大数据,再到未来的AI,VR,IoT……,技术创新的浪潮一波接一波的过来,你是想在那继续搬砖搬下去,是想迎浪而上去经历浪潮,还是想成为一个随波逐流的人?
打工也好,创业也好,在国内也好,在国外也好,这些都是形式,不是内容。内容则是你有没有和有想法的人去经历有意义有价值事?人生苦短,白驹过隙,我们技术人员最大的幸运就是生在这样一个刺激的时代,那么,你还有什么理由不去追逐这些前沿刺激的经历呢?
我相信“自由”这个事,是所有人的心中都会想去追求的。“生命诚可贵,爱情价更高,…… ”(哈哈)
但一说起自由,绝大多数人都想到的是“财富自由”或是“财务自由”,其实,并不完全是这样的,在自由的通路上,我个人的经历告诉我,其实,你会有很多的不同类型的自由。下面,是我对几个层次的“自由”的理解。
第一层自由——工作自由。人的第一层自由的境界是——“工作自由”,我到不是说你在工作单位上可以很自由,虽然有特例,但并不普遍。我想说的“工作自由”是——你不会有失业危机感了。也就是说,你成了各个公司的抢手货,你不但不愁找不到工作,而且你是完全不愁找不到好工作。试想一下,如果是工作来找你,一方面,你就有真正意义上的工作选择权了,另一方面,你都不愁工作了,你完全就可以随时离职去干你想干的事了。此时,你就达到了“工作自由”。
第二层自由——技能自由。工作自由已是不错,不过前提是你还是需要依赖于别人提供的工作机会。而技能自由则是你可以用自己的技能养活自己,而不需要去公司里工作。也就是所谓的自由职业者了,社会上,这样的人也不少,比如,一些健身体育教练、设计师、翻译者、作者……这些都可以算是自由职业者,程序员这个职业中只要不是搬砖的,有想法的,就有可以成为自由积业者的潜质,想一想,你拥有的编程能力,其实是一种创造的能力,也就是创造力,只要你Make Something People Want(YC创业公司的slogan),你是完全可以通过自己的技能来养活自己的。如果你通过某些自动化的东西,或是你在App上做了一个软件个体户,让自己的收入不断,甚至你做了一个开源软件,社区每个月都给你捐款捐到比你打工挣的还多,那么你就真正的有了技能自由了。
第三层自由——物质自由。我把财务自由换了一种说法。我个人觉得,除了有个好爸爸之外这种特例的情况,如果你想有物质自由的话,本质上来说,你一定要学会投资,投资不一定是你的钱,时间也是一种财富,年轻更是,你怎么投资你的时间还有你的青春?你要把你的投资投到什么样的事,什么样的人?对于投资这个事,风险也比较大。但是,人生不敢冒险可能才是最大的冒险。这个世界有很多技术不是你能看书学来的,而要只能在实战中学会的,比如:游泳。投资可能也是一种。只有真正懂投资的人,或是运气非常好的人,才可能实现物质自由。
追求自由的生活,其实也是个人发展道路上的一个不错的选择。通常来说,自由的人,能力都不差,钱也不会少。因为,他们懂得投资。
也就是说,拥有追求自由能力的的人,
不但有领导力和创造力(也可指导大多数人并走在大多数人前面)
同时他还懂得怎么投资(知道时间和精力和金钱应该投在什么地方)
(注:这里我没有提精神自由,老实说,精神上的自由我也不清楚是什么东西,因为我还没有见过,眼界有限,所以先按不表了,不然真成鸡汤文了)
总结
无论是在职场中打拼,还是追求精彩的经历,还是去实现自由,我觉得都是不错的个人发展的方向。
他们都有重叠,比如:
你可以在职场中去追求那些刺激的经历的公司。
同样也可以通过加入有潜力高速发展的公司来达到自由。
你也可以通过追寻不一样的经历来达到人生的自由。
……
总之,这里的逻辑是——
能够去规划自己的个人发展的人,通常都是有很多机会和可能性的人。
有很多机会和可能性的人,通常都是有Leadership,喜欢冒险的人。
有Leadership喜欢冒险的人,通常都是学习能力强,思维活跃,喜欢折腾,懂得“投资”的人。
学习能力强思维活跃的人,通常来说,都是喜欢看书,喜欢实践和新鲜事物,不怕艰难和挑战,用智力而不是使蛮力的人。
懂得“投资”的人,通常来说,他们更多的关注的是未来和长远的成长,而不是当下的KPI、奖金和晋升。
阿里,估计GG!
美团、今日头条,一首凉凉送给自己!
未来秋招,需做到万事俱备,只欠东风!
笔试很多题目就是面试出的基础题目,语言基础、网络、数据库、linux,这些都是必考的,所以在校招之前和校招过程中,最好保持每天刷一定量的题(50起),注意查漏补缺,重点刷自己的短板。但前提是,以上书单或者相似的内容都已经学会,否则很容易在笔/面试中铩羽而归。
面试是一场个人show,是对自己目前已有知识与项目的一种展示,更是对面试者的全面审查。所以不只是硬实力的比拼,也考虑个人的综合素质,也就是所谓的软实力。我认为软实力这方面主要就是每个人的情商表现了,性格方面的东西是很难取改变的,由此每个人的作风也有所区别。但是在面试过程适当的掩盖自己的锋芒与说话的技巧还是极其重要的。大体可以总结为:
(1)保持自信的姿态,相信自己能够胜任这一份工作,语言有力,连贯并富有力量感
(2)保持谦卑的态度,认可面试官的知识能力,能够坦然接受面试官的所有评价,即使是嘲讽,切忌强烈反驳(双选过程,实在不开心不外乎就不去了)
(3)适当展示自己的价值观与人生观,每个公司都喜欢找契合自己公司文化的人,所以适当展示这方面,会给面试官一种很舒服的柑橘
(4)锻炼自己的反应能力,面试问题是不可控的,面试官会问到什么问题大都是无法预测的,所以保持绝对的热情与饱满的精神状态去面对,即使遇到不懂的问题很多时候也能够凭借本身的实力与灵活的现场反应能力回答上一二,加上面试官的提示,是完全可能回答好的。
(5)专注的注意力,在面试过程中,有时候是会有前后联系的,能判断到面试官擅长或者感兴趣的内容时,可以尽量往哪方面描述,可能会有意想不到的效果。
(1) 学习过程中,注意总结笔/面试会可能会问到的问题,重点研究。举个栗子,鸟哥的linux家常菜这本书通俗易懂,看过一遍,估计也就一周。推荐边看边刷题(赞一波牛客的题库),即使刷题耽误了看书时间,也能慢慢让你培养出笔试的感觉,看完了你自然而然就知道这本书哪一块是重点,哪一块过一遍即可,然后再去刷题,看面经里面出现的linux命令的题目(如果分数ok,题目也都会,那么下一本)。
(2) 笔试过程中注重归纳与总结,记录每一类高频问题,可以在牛客上先找别人列出的问题,但是一定要将每个问题研究透彻,随时对其进行补充。
(3) 算法题除了多刷图以外,可以在自己电脑上将自己平时练习的算法题目进行总结,写一些通用的小算法,例如字符串题目、数组题目,dp问题,有些问题经常只是意境变换了,实际算法还是用得上的。
一言以蔽之,多看多练多总结,笔试不能高分也会通过。
另外:如果有线下笔试,都推荐线下笔试,难度会降低。
面试是一个考核的现场,在实力之外,是需要技巧来支撑的,能够掌控面试节奏与放任面试节奏绝对是两个感受。。而校招本身就是一场战役,如果大厂岗位逐年减少,而IT学生越来越多,僧多粥少,没有准备的站会输得很惨。
(1)简历问题:互联网简历最重要的就是技能树和项目,其他都是锦上添花的东西。所以写上简历的东西一定要极其熟悉,自己深入项目,考虑面试官会询问什么问题,如果面试官问到你没有考虑到的地方,可以尝试发散思维去想去说,最好不要什么都说,甚至可以说你自己理解的但是其实不太相关的东西,至少要让他知道你是考虑过项目的整体框架,内在联系,存在问题以及改进空间的。另外,在面试几次之后,项目你也介绍过几遍了,面试官可能也提出一些问题,基于这些问题,重新润色简历上的项目描述,并且重新熟悉自己介绍项目的说辞,对面试官可能提出的问题做到心中有数。
简历上的技能,对自己写的每一项做到心中有数,例如,你写上“熟悉TCP/IP协议及其编程”,那么面试官问你建立服务器的socket函数有哪些,分别什么作用,你总不能不会吧?我最开始对数据库不太熟,没有系统复习过,简历上就没写数据库,然后美团面试的时候,一直问JAVA和数据库,我都直说不会/不太熟,面试官没有过分刁难,虽然还是问了很多。
(2)面试的准备
面试之前,前面简历的问题要熟透,嚼烂已知的项目的坑,并在后面面试中慢慢补全。知识技能方面,多看面经,首先将面试岗位的高频面试题都事先熟悉,用面经上面的题目自我考核,判断自己能不能很流利地回答出来。何谓流利地说出来,就是富有条理性的,透彻的,横向纵向结合的描述。并且在看面经的过程,可以扩展的看,每个问题的延伸问题,最后都花时间去琢磨(博客是个好东西,多看)。后面我会给出我知道的C++研发高频题目。
(3)面试过程的技巧
首先如果可以现场面,推荐现场面试,优势在于能够让面试官看到你的精气神,确保面试期间精神饱满,富有交流欲,尤其和面试官保持眼神交流,让他看到你的态度,并且对于每个问题,不管会不会,多问问面试官总是没错的。这个我认为是最重要的,每次面试官问的问题,我一般都是紧盯这面试官说,我是这么考虑的,您看看对不对/我对这一块不是特别熟悉,但我是这么想的,麻烦您指点一下/对于这个问题,我们分成三部分考虑,首先…
有人说面试变成了一站到底,这是很难避免的,面试官为了追求效率,考察你是否具备他们所要的技能,那么语言基础、网络、数据库、算法、linux基础,都必须至少两三个问题,于是他们就一个一个蹦出来。这种时候,你最好要稳住节奏,表现出足够的表现欲,对擅长的问题进行扩展,深挖,让面试官意识到你在某一方面很厉害,促使他去按照你想的方向去了解。聚个栗子,面试官问是否了解linux的IO模型,我一般是这么回答的,“对于这个问题,我们首先要理解同步异步、阻塞非阻塞的概念,balabala,他们之间的区别可以类比为XXX。在理解这些之后,我们将IO模型分为五类,分别是XXX”,讲完这些估计就要五分钟,相比你不咸不谈说,有五种,是XXX,面试官不详细问它们的特点你就不说,是不是差距很大。假设我有点忘记了IO模型的分类,那么前面的铺垫是不是也可以给自己时间去回忆。我经常是在面试期间忘了某个问题的答案,于是一边打打擦边球,一边大脑快速回忆这个问题,很可能在讲着讲着就想起来了。即是你想不起来,也绝对你比支支吾吾说不了几个字强太多了。
(4)面试的心态
前面说到了,精神一定要饱满,尽可能有信心一点。当然,我觉得对于前面几次面试的同学或者手上还没有靠谱offer的同学,紧张无可避免,那么就告诉自己,上次我面到了一面,这次我只要一面过了就好,一点一点目标往上提。
面试中自己的面试尽可能不要太受面试官影响,毕竟有些面试官确实不太负责,在面试期间时不时做一点别的事情,我们要做的就是做到自己的最好,描述清晰而流利,控制语速(我中兴面试的时候自我介绍实在太熟了,说得太快,被面试官提了一下)。
非科班同学面试经常碰到的一个问题就是,你不是这个计算机专业的呀/你的专业跟我们不匹配啊。这个问题很现实也很尖锐,毕竟科班出身的人就那么多,我凭什么要你不要他们,所以你要展示的就是你得计算机技能不比别人差,你的自学能力比普通人要强,或者你做的项目比别人牛逼,或者你比别人更能坚持,语言是很无力的,即使你说了,面试官也不一定就相信,所以在后面的面试拿出实力来表现自己。放在这里是想说,首先你自己心态要摆正,非科班对面试是正buff还是负buff,重点还在面试者自己身上,大公司一般不会卡这方面,更不会因此鄙视你,所以坦然一些,用实力告诉他们我们能行。
(5)面试后的总结与再准备
面试后,最关键是什么?还是总结。很多时候其实面试完毕你就大致知道结果了,至少你知道你能够根据面试官的反馈知道你自己的缺陷在哪里,记录下来。如果可能,每天都用word或者博客进行记录,短暂时间的将重点问题记录在手机备忘录上,然后找时间将这些问题一个一个克服。我个人是将问题都分类,分类总结记录,并且查资料将问题彻底弄明白。在经历三四次这个过程之后,你应该会很赞同这样一句话:面试是提高能力的最好途径。没错,你最初的总结一般都是很片面的,或者不符合面试需求的,但是在实战几次之后,你就会明白哪里才是重点,哪里是次要的,也明白自己的优势或者擅长的地方是哪些。在知道这些之后,面试过程中,就可以尽可能的避重就轻,引导面试官往你擅长的方面去说。还是聚个栗子,腾讯面试的时候,问了我http的状态码,我当时真的完全忘记了,就说这个我记得不太清楚,但是我了解的http是应用层上的XXX,版本有http1.0 1.1 2.0,动作一般有…,为了安全会用https来代替http。这样过渡掉这个问题,引导面试官来到你说的这些问题上(当然前提是你说这些可不能不会,不然就是自己挖坑自己跳了)。
还是回归面试后的心态,面试后就尽量不要过度去考虑这一场面试通过与否,最重要的是总结和准备下一场面试。这里也适用于笔试,校招时候公司太多,每天面试笔试往往都很多,没有太多时间给你感伤或者惊喜,在没有确定秋招结束之前,这里一直都是战场,不能松懈否则你可能就输了下一场。尤其是,如果面试失败了,那种低落情绪几乎避免不了,我们要做的就是尽可能缩短这个低落时间。我一直很看重京东的面试,抱了很大的期望,面试过程中感觉也很不错,但是当天就挂了,当时表示完全理解不了,非常低落,甚至开始怀疑自己的能力。这个时候,就必须和家人朋友聊一聊,放松一下,然后重新开始(有个信念,就是这是千万人都在争的路,输了也正常,但是我们都没有退路,没有任何办法,总结总结重新开始吧)
面试过程,真的不是学习或者工程能力强就能够拿到offer的,自身软实力也极其重要。心态,反应能力,态度,甚至状态都是能否通过一场面试至关重要的因素,这些就要靠我们自己去慢慢摸索与准备。我在拿到一些offer之后,跟同学讨论过,发现挺多人存在一个问题就是:对于很平常的问题,他们表现出不知道应该怎么回答,例如专业面的你在项目过程中最大的难点是什么,怎么克服的;HR面的你怎么评价你的研究生/本科生涯等等。这些问题说白了都是情商,无关技术,但是又很影响面试官对你的看法。这些问题没有标准答案,但是,保持诚恳的态度与真实的描述(当然实现要有所准备)是总是能够拉近和面试官的距离的。
以C++开放举例,粗略说说笔试一般会考哪些内容:
(1) 语言基础,C++中的定义,指针,模板,多态,重载等(尤其是多态,给定一个程序,基类子类有不同实现,考虑输出结果,这一类的题目面试题也极为高频)
(2) TCP/IP协议及其编程:计算机网络基础,socket编程,其中子网划分,七层协议(例如交换机属于数据链路层一类题目),五层协议,协议名称及其作用,常用端口号,https1.0 1.1特性与区别,三次握手四次挥手(可能出现的服务器攻击),加密(对称,非对称),IO复用等
(3) 操作系统:进程通信方式(linux/windows,每种方式的特点),线程通信(linux/windows),进程与线程区别,页面置换策略(考察置换几次),进/线程状态转换图,进程调度方式,死锁(必要条件,哲学家就餐,银行家,读者写者问题),
(4) 数据库:索引作用,应该/不应该创建索引的列,索引底层实现,sql语法,常见引擎特点,事务特点,隔离级别(引擎默认级别),隔离级别的问题,锁等
(5) Linux方面:IO模型,linux常见命令(grep,awk,sed),文件系统,
(6) 智力题:智力题是大公司笔试面试很喜欢出的题目,重在考察思维能力,也是为了选出潜力更大的人来吧。我没有刷过这类题,如果自我感觉这方面有欠缺的话可以自己在牛客上刷题。
(7) 算法:剑指offer,leetcode,左神的书和视频,任意两个搞定你都没有问题
那么说说面试的硬实力。
1.语言基础(Java)
J2SE基础
九种基本数据类型的大小,以及他们的封装类。
Switch能否用string做参数?
equals与==的区别。
Object有哪些公用方法?
Java的四种引用,强弱软虚,用到的场景。
Hashcode的作用。
ArrayList、LinkedList、Vector的区别。
String、StringBuffer与StringBuilder的区别。
Map、Set、List、Queue、Stack的特点与用法。
HashMap和HashTable的区别。
HashMap和ConcurrentHashMap的区别,HashMap的底层源码。
TreeMap、HashMap、LindedHashMap的区别。
Collection包结构,与Collections的区别。
try catch finally,try里有return,finally还执行么?
Excption与Error包结构。OOM你遇到过哪些情况,SOF你遇到过哪些情况。
Java面向对象的三个特征与含义。
Override和Overload的含义去区别。
Interface与abstract类的区别。
Static class 与non static class的区别。
java多态的实现原理。
实现多线程的两种方法:Thread与Runable。
线程同步的方法:sychronized、lock、reentrantLock等。
锁的等级:方法锁、对象锁、类锁。
写出生产者消费者模式。
ThreadLocal的设计理念与作用。
ThreadPool用法与优势。
Concurrent包里的其他东西:ArrayBlockingQueue、CountDownLatch等等。
wait()和sleep()的区别。
foreach与正常for循环效率对比。
Java IO与NIO。
反射的作用于原理。
泛型常用特点,List
解析XML的几种方式的原理与特点:DOM、SAX、PULL。
Java与C++对比。
Java1.7与1.8新特性。
设计模式:单例、工厂、适配器、责任链、观察者等等。
JNI的使用。
Java里有很多很杂的东西,有时候需要你阅读源码,大多数可能书里面讲的不是太清楚,需要你在网上寻找答案。
推荐书籍:《java核心技术卷I》《Thinking in java》《java并发编程》《effictive java》《大话设计模式》
JVM
内存模型以及分区,需要详细到每个区放什么。
堆里面的分区:Eden,survival from to,老年代,各自的特点。
对象创建方法,对象的内存分配,对象的访问定位。
GC的两种判定方法:引用计数与引用链。
GC的三种收集方法:标记清除、标记整理、复制算法的原理与特点,分别用在什么地方,如果让你优化收集方法,有什么思路?
GC收集器有哪些?CMS收集器与G1收集器的特点。
Minor GC与Full GC分别在什么时候发生?
几种常用的内存调试工具:jmap、jstack、jconsole。
类加载的五个过程:加载、验证、准备、解析、初始化。
双亲委派模型:Bootstrap ClassLoader、Extension ClassLoader、ApplicationClassLoader。
分派:静态分派与动态分派。
JVM过去过来就问了这么些问题,没怎么变,内存模型和GC算法这块问得比较多,可以在网上多找几篇博客来看看。
推荐书籍:《深入理解java虚拟机》
操作系统
进程和线程的区别。
死锁的必要条件,怎么处理死锁。
Window内存管理方式:段存储,页存储,段页存储。
进程的几种状态。
IPC几种通信方式。
什么是虚拟内存。
虚拟地址、逻辑地址、线性地址、物理地址的区别。
因为是做android的这一块问得比较少一点,还有可能上我简历上没有写操作系统的原因。
推荐书籍:《深入理解现代操作系统》
TCP/IP
OSI与TCP/IP各层的结构与功能,都有哪些协议。
TCP与UDP的区别。
TCP报文结构。
TCP的三次握手与四次挥手过程,各个状态名称与含义,TIMEWAIT的作用。
TCP拥塞控制。
TCP滑动窗口与回退N针协议。
Http的报文结构。
Http的状态码含义。
Http request的几种类型。
Http1.1和Http1.0的区别
Http怎么处理长连接。
Cookie与Session的作用于原理。
电脑上访问一个网页,整个过程是怎么样的:DNS、HTTP、TCP、OSPF、IP、ARP。
Ping的整个过程。ICMP报文是什么。
C/S模式下使用socket通信,几个关键函数。
IP地址分类。
路由器与交换机区别。
网络其实大体分为两块,一个TCP协议,一个HTTP协议,只要把这两块以及相关协议搞清楚,一般问题不大。
推荐书籍:《TCP/IP协议族》
数据结构与算法
链表与数组。
队列和栈,出栈与入栈。
链表的删除、插入、反向。
字符串操作。
Hash表的hash函数,冲突解决方法有哪些。
各种排序:冒泡、选择、插入、希尔、归并、快排、堆排、桶排、基数的原理、平均时间复杂度、最坏时间复杂度、空间复杂度、是否稳定。
快排的partition函数与归并的Merge函数。
对冒泡与快排的改进。
二分查找,与变种二分查找。
二叉树、B+树、AVL树、红黑树、哈夫曼树。
二叉树的前中后续遍历:递归与非递归写法,层序遍历算法。
图的BFS与DFS算法,最小生成树prim算法与最短路径Dijkstra算法。
KMP算法。
排列组合问题。
动态规划、贪心算法、分治算法。(一般不会问到)
大数据处理:类似10亿条数据找出最大的1000个数………等等
算法的话其实是个重点,因为最后都是要你写代码,所以算法还是需要花不少时间准备,这里有太多算法题,写不全,我的建议是没事多在OJ上刷刷题(牛客网、leetcode等),剑指offer上的算法要能理解并自己写出来,编程之美也推荐看一看。
推荐书籍:《大话数据结构》《剑指offer》《编程之美》
Android
Activity与Fragment的生命周期。
Acitivty的四中启动模式与特点。
Activity缓存方法。
Service的生命周期,两种启动方法,有什么区别。
怎么保证service不被杀死。
广播的两种注册方法,有什么区别。
Intent的使用方法,可以传递哪些数据类型。
ContentProvider使用方法。
Thread、AsycTask、IntentService的使用场景与特点。
五种布局: FrameLayout 、 LinearLayout 、 AbsoluteLayout 、 RelativeLayout 、 TableLayout 各自特点及绘制效率对比。
Android的数据存储形式。
Sqlite的基本操作。
Android中的MVC模式。
Merge、ViewStub的作用。
Json有什么优劣势。
动画有哪两类,各有什么特点?
Handler、Loop消息队列模型,各部分的作用。
怎样退出终止App。
Asset目录与res目录的区别。
Android怎么加速启动Activity。
Android内存优化方法:ListView优化,及时关闭资源,图片缓存等等。
Android中弱引用与软引用的应用场景。
Bitmap的四中属性,与每种属性队形的大小。
View与View Group分类。自定义View过程:onMeasure()、onLayout()、onDraw()。
Touch事件分发机制。
Android长连接,怎么处理心跳机制。
Zygote的启动过程。
Android IPC:Binder原理。
你用过什么框架,是否看过源码,是否知道底层原理。
Android5.0、6.0新特性。
Android的话,多是一些项目中的实践,使用多了,自然就知道了,还有就是多逛逛一些名人的博客,书上能讲到的东西不多。另外android底层的东西,有时间的话可以多了解一下,加分项。
推荐书籍:《疯狂android讲义》《深入理解android》
其他综合性的书籍也需要阅读,推荐:《程序员面试笔试宝典》《程序员面试金典》。另外“牛客网www.newcoder.com”是个好地方,里面有各种面试笔试题,也有自己在线的OJ,强烈推荐,还有左程云老师的算法视屏课(已经出书了),反正我看了之后对我帮助很大(这不是植入广告)。
三、 项目
关于项目,这部分每个人的所做的项目不同,所以不能具体的讲。项目不再与好与不好,在于你会不会包装,有时候一个很low的项目也能包装成比较高大上的项目,多用一些专业名词,突出关键字,能使面试官能比较容易抓住重点。在聊项目的过程中,其实你的整个介绍应该是有一个大体的逻辑,这个时候是在考验你的表达与叙述能力,所以好好准备很重要。
面试官喜欢问的问题无非就几个点:
XXX(某个比较重要的点)是怎么实现的?
你在项目中遇到的最大的困难是什么,怎么解决的?
项目某个部分考虑的不够全面,如果XXXX,你怎么优化?
XXX(一个新功能)需要实现,你有什么思路?
其实你应该能够预料到面试官要问的地方,请提前准备好,如果被问到没有准备到的地方,也不要紧张,一定要说出自己的想法,对不对都不是关键,主要是有自己的想法,另外,你应该对你的项目整体框架和你做的部分足够熟悉。
四、 其他
你应该问的问题
面试里,最后面完之后一般面试官都会问你,你有没有什么要问他的。其实这个问题是有考究的,问好了其实是有加分的,一般不要问薪资,主要应该是:关于公司的、技术和自身成长的。
以下是我常问的几个问题,如果需要可以参考:
贵公司一向以XXX著称,能不能说明一下公司这方面的特点?
贵公司XXX业务发展很好,这是公司发展的重点么?
对技术和业务怎么看?
贵公司一般的团队是多大,几个人负责一个产品或者业务?
贵公司的开发中是否会使用到一些最新技术?
对新人有没有什么培训,会不会安排导师?
对Full Stack怎么看?
你觉得我有哪些需要提高的地方?
知识面
除了基础外,你还应该对其他领域的知识有多少有所涉猎。对于你所熟悉的领域,你需要多了解一点新技术与科技前沿,你才能和面试官谈笑风生。
软实力
什么是软实力,就是你的人际交往、灵活应变能力,在面试过程中,良好的礼节、流畅的表达、积极的交流其实都是非常重要的。很多公司可能不光看你的技术水平怎么样,而更看重的是你这个人怎么样的。所以在面试过程中,请保持诚信、积极、乐观、幽默,这样更容易得到公司青睐。
很多时候我们都会遇到一个情况,就是面试官的问题我不会,这时候大多数情况下不要马上说我不会,要懂得牵引,例如面试官问我C++的多态原理,我不懂,但我知道java的,哪我可以向面试官解释说我知道java的,类似的这种可以往相关的地方迁移(但是需要注意的是一定不要不懂装懂,被拆穿了是很尴尬的),意思就是你要尽可能的展示自己,表现出你的主动性,向面试官推销自己。
还有就是遇到智力题的时候,不要什么都不说,面试官其实不是在看你的答案,而是在看你的逻辑思维,你只要说出你自己的见解,有一定的思考过程就行。
2语言基础(C++)
(1) 指针和引用的区别
(2) 堆和栈的区别
(3) new和delete是如何实现的,new 与 malloc的异同处
(4) C和C++的区别
(5) C++、Java的联系与区别,包括语言特性、垃圾回收、应用场景等(java的垃圾回收机制)
(6) Struct和class的区别
(7) define 和const的区别(编译阶段、安全性、内存占用等)
(8) 在C++中const和static的用法(定义,用途)
(9) const和static在类中使用的注意事项(定义、初始化和使用)
(10)C++中的const类成员函数(用法和意义)
(11) 计算下面几个类的大小:
class A {};: sizeof(A) = 1;
class A { virtual Fun(){} };: sizeof(A) = 4(32位机器)/8(64位机器);
class A { static int a; };: sizeof(A) = 1;
class A { int a; };: sizeof(A) = 4;
class A { static int a; int b; };: sizeof(A) = 4;
(12) 给一个代码,求输出结果
class A
{
public:
A(int x){}
}
问:A a = 1;是否正确, 如果正确, 那么它调用了哪些函数?
这类题目更常见的是在基类和子类有不同实现方法。(虚函数相关,栗子很多,不多说了)
(13) C++的STL介绍(这个系列也很重要,建议侯捷老师的这方面的书籍与视频),其中包括内存管理allocator,函数,实现机理,多线程实现等
(14) STL源码中的hash表的实现
(15) STL中unordered_map和map的区别
(16) STL中vector的实现
(17) vector使用的注意点及其原因,频繁对vector调用push_back()对性能的影响和原因。
(18) C++中的重载和重写的区别:
(19) C ++内存管理(热门问题)
(20) 介绍面向对象的三大特性,并且举例说明每一个。
(21) 多态的实现(和下个问题一起回答)
(22) C++虚函数相关(虚函数表,虚函数指针),虚函数的实现原理(热门,重要)
(23) 实现编译器处理虚函数表应该如何处理
(24) 析构函数一般写成虚函数的原因
(25) 构造函数为什么一般不定义为虚函数
(26) 构造函数或者析构函数中调用虚函数会怎样
(27) 纯虚函数
(28) 静态绑定和动态绑定的介绍
(29) 引用是否能实现动态绑定,为什么引用可以实现
(30) 深拷贝和浅拷贝的区别(举例说明深拷贝的安全性)
(31) 对象复用的了解,零拷贝的了解
(32) 介绍C++所有的构造函数
(33) 什么情况下会调用拷贝构造函数(三种情况)
(34) 结构体内存对齐方式和为什么要进行内存对齐?
(35) 内存泄露的定义,如何检测与避免?
(36) 手写实现智能指针类(34-37我没遇见过)
(37) 调试程序的方法
(38) 遇到coredump要怎么调试
(39) 内存检查工具的了解
(40) 模板的用法与适用场景
(41) 成员初始化列表的概念,为什么用成员初始化列表会快一些(性能优势)?
(42) 用过C11吗,知道C11新特性吗?(有面试官建议熟悉C11)
(43) C++的调用惯例(简单一点C++函数调用的压栈过程)
(44) C++的四种强制转换
2计算机网络(TCP/IP)
(1) 建立TCP服务器的各个系统调用
(2) 继上一题,说明socket网络编程有哪些系统调用?其中close是一次就能直接关闭的吗,半关闭状态是怎么产生的?
(3) 对路由协议的了解与介绍。内部网关协议IGP包括RIP,OSPF,和外部网关协议EGP和BGP.
(4) 路由协议所使用的算法。
(5) TCP和UDP的区别
(6) TCP和UDP相关的协议与端口号
(7) TCP(UDP,IP)等首部的认识(http请求报文构成)
(8) 网页解析的过程与实现方法
(9) 在浏览器中输入URL后执行的全部过程(如www.baidu.com)
(10) 网络层分片的原因与具体实现
(11) TCP的三次握手与四次挥手的详细介绍(TCP连接建立与断开是热门问题)
(12) TCP握手以及每一次握手客户端和服务器端处于哪个状态(11种状态)
(13) 为什么使用三次握手,两次握手可不可以?
(14) TIME_WAIT的意义(为什么要等于2MSL)
(15) 超时重传机制(不太高频)
(16) TCP怎么保证可靠性(面向字节流,超时重传,应答机制,滑动窗口,拥塞控制,校验等)?
(17) 流量控制的介绍,采用滑动窗口会有什么问题(死锁可能,糊涂窗口综合征)?
(18) tcp滑动窗口协议
(19) 拥塞控制和流量控制的区别
(20) TCP拥塞控制,算法名字?(极其重要)
(21) http协议与TCP联系
(22) http/1.0和http/1.1的区别
(23) http的请求方法有哪些?get和post的区别。
(24) http的状态码
(25) http和https的区别,由http升级为https需要做哪些操作
(26) https的具体实现,怎么确保安全性
(27) http中浏览器一个URL的流程,这个过程中浏览器做了什么,URL包括哪三个部分?
(28) 一个机器能够使用的端口号上限是多少,为什么?可以改变吗?那如果想要用的端口超过这个限制怎么办?
(29) 对称密码和非对称密码体系
(30) 数字证书的了解(高频)
(31) 客户端为什么信任第三方证书
(32) RSA加密算法,MD5原理(MD5不算加密算法)
(33) 单条记录高并发访问的优化
(34) 介绍一下ping的过程,分别用到了哪些协议
(35) TCP/IP的分片粘包过程
(36) 有没有抓过TCP包,描述一下
(37) 一个ip配置多个域名,靠什么识别?
(38) 服务器攻击(DDos攻击)
3数据库(MySQL)
数据库我自身不是特别熟,面试的时候一般也都坦言了,所以面试官都只是问一些基础题目。
(1) 关系型和非关系型数据库的区别(各自优点)
(2) 常用SQL语句(DDL,DML,DCL,TCL)
(3) 数据库中join的类型与区别(inner join, outer join, cross join, natural join, self join),注意适用场景和sql语句的编写
(4) 数据库的索引类型
(5) 聚集索引和非聚集索引的区别(叶节点存储内容)
(6) 唯一性索引和主码索引的区别
(7) 索引的优缺点,什么时候使用索引,什么时候不能使用索引(重点)
(8) 索引的底层实现(B+树,为何不采用红黑树,B树)
(9) B树和B+树具体实现
(10) 索引最左前缀问题
(11) Mysql的优化(高频,索引优化,性能优化)
(12) 数据库引擎介绍,innodb和myisam的特点与区别
(13) 数据库中事务的ACID(四大特性都要能够举例说明,理解透彻,比如原子性和一致性的关联,隔离性不好会出现的问题)
(14) 数据库隔离性设置不同会出现的问题(脏读、不可重复读、丢失修改、幻读)
(15) 数据库的隔离级别,mysql和Oracle的隔离级别分别是什么
(16) 数据库连接池的作用
(17) Mysql的表空间方式,各自特点
(18) 分布式事务
(19) 数据库的范式
(20) 数据的锁的种类,加锁的方式
(21) 视图的作用与使用方法(如何删除等)
(22) 分库分表,主从复制,读写分离。(我不会,也没碰到过)
(23) 项目中哪里用到了数据库,怎么用的
4Linux基础
Linux这一块如果不太熟,可以直接说,但是因为开发岗位一般都是在Linux平台下的,所以几个基础问题还是要会的。
(1) Linux的I/O模型介绍以及同步异步阻塞非阻塞的区别(超级重要)
(2) 文件系统的理解(EXT4,XFS,BTRFS)
(3) 文件处理grep,awk,sed这三个命令必知必会
(4) IO复用的三种方法(select,poll,epoll)深入理解,包括三者区别,内部原理实现?
(5) Epoll的ET模式和LT模式(ET的非阻塞)
(6) 查询进程占用CPU的命令(注意要了解到used,buf,cache代表意义)
(7) linux的其他常见命令(kill,find,cp等等)
(8) shell脚本用法
(9) 硬连接和软连接的区别
(10) 文件权限怎么看(rwx)
(11) 文件的三种时间(mtime, atime,ctime),分别在什么时候会改变
(12) Linux监控网络带宽的命令,查看特定进程的占用网络资源情况命令
5操作系统
(1) 进程与线程的区别和联系
(2) 一个进程可以创建多少线程,和什么有关
(3) 一个程序从开始运行到结束的完整过程(四个过程)
(4) 进程通信方法(Linux和windows下),线程通信方法(Linux和windows下)
(5) 进程调度方法详细介绍
(6) 页面置换方法详细介绍
(7) 能否实现一个LRU算法
(8) 死锁的必要条件(怎么检测死锁,解决死锁问题)
(9) 哲学家就餐,银行家,读者写者,生产者消费者(怎么加锁解锁,伪代码)
(10) 海量数据的bitmap使用原理
(11) 布隆过滤器原理与优点
(12) 布隆过滤器处理大规模问题时的持久化,包括内存大小受限、磁盘换入换出问题
(13) 同步IO和异步IO
(14) 文件读写使用的系统调用
(15) 线程池的了解、优点、调度处理方式和保护任务队列的方式
(16) 怎么回收线程
(17) 僵尸进程问题
(18) 多线程同步(尤其是如果项目中用到了多线程,很大可能会结合讨论)
(19) memcache了解
(20) 异常和中断的区别
(21) 一般情况下在Linux/windows平台下栈空间的大小
6设计模式和算法
设计模式一般都不会考太多,除非你明确说自己懂。我基本上就不涉及到设计模式的东西,所以只是简要说说。当然,单例模式和简单工厂模式的概念和使用场景还是要知道的。
(1) 介绍熟悉的设计模式(单例,简单工厂模式)
(2) 写单例模式(饿汉模式和懒汉模式),线程安全版本
(3) MVC设计模式
算法这一块太过庞大,几乎都有可能,牛油们最好还是去刷剑指offer(level 1),leetcode(如果能够刷到最高难度,算法对你来说已经不是什么了,或者说面试对你来说简直就是吃饭喝水的难度),左神的书《程序源代码面试指南》(字符串,数组,dp,海量数据问题,搞定它们也就搞定面试的一半)。
下面还是简单的列举一些吧(包括一些数据结构题目,只列举简单的,面试的算法一半不会太难,但是现在一般都是需要比较好的思维,或者曾经接触过这方面的题,建议就是多刷题,做题感觉是刷出来的)
(1) 红黑树的了解(平衡树,二叉搜索树),使用场景
(2) 红黑树在STL上的应用
(3) 了解并查集吗?(低频)
(4) 贪心算法和动态规划的区别
(5) 判断一个链表是否有环,如何找到这个环的起点
(6) 实现一个strcpy函数(或者memcpy),如果内存可能重叠呢
(7) 实现一个循环队列
(8) 排序算法(写快排,归并排序,堆排序),算法的时间复杂度,空间复杂度,是否稳定等
(9) 快排存在的问题,如何优化
(10) 反转一个链表
(11) Top K问题(可以采取的方法有哪些,各自优点?)
(12) Bitmap的使用,存储和插入方法
(13) 二叉树的先序、中序、后序遍历(非递归实现)
(14) 二叉树的公共祖先(简单地说,剑指offer上的题大都是高频题)
(15) 1-n中有多少个1
(16) 字典树的理解以及在统计上的应用
(17) 数组的全排列
(18) N个骰子出现和为m的概率
(19) 海量数据问题(可参考左神的书)
(20) 一致性哈希
7智力题
我特别把智力题单独拿出来讲,是因为这一块其实有些公司很看重(例如腾讯),但是我基本上也没刷过这类题目,接触不多,牛油们自行补充吧。
(1) 100层楼,只有2个鸡蛋,想要判断出那一层刚好让鸡蛋碎掉,给出策略(滴滴笔试中两个铁球跟这个是一类题)
(2) 毒药问题,n拼毒药,要快速找出哪一瓶有毒,需要几只小白鼠
(3) 博弈论问题
(4) 先手必胜策略问题:n本书,每次能够拿X-X本,怎么拿必胜
(5) 放n只蚂蚁在一条树枝上,蚂蚁与蚂蚁之间碰到就各自往反方向走,问总距离或者时间。
(6) 瓶子换饮料问题:多少个瓶子能够换1瓶饮料,问最多能喝几瓶
近期准备华为的比赛,确实感觉到自己编码能力的欠缺,不过值得欣慰的是找到了以前的编码感觉!周围的人形成了一种积极向上的学习风气(ps:现在舍友都没有回宿舍!),每个人都在为了自己的生活而拼搏!
(1)复习基础知识 (刷牛客基础题)
(2)复习java知识、多线程、设计模式、写算法题
(3)写论文
(4)准备近期的面试
貌似下一届的考研学子又要来复试了,现在考研国线越来越低,大军越来越庞大!不管怎么说都是过来人,深知其中的心酸,祝他们复试顺利!
]]>