面试

了解红黑树的起源,理解红黑树的本质

一世执手 提交于 2021-01-10 12:54:32
前言 本文收录于专辑:http://dwz.win/HjK,点击解锁更多数据结构与算法的知识。 你好,我是彤哥。 前面两节,我们一起学习了关于跳表的理论知识,并手写了两种完全不同的实现,我们放一张图来简单地回顾一下: 实现跳表的关键之处是在有序链表的基础上加上各层索引,通过这些索引可以做到O(log n)的时间复杂度快速地插入、删除、查找元素。 说起跳表,我们就不得不提另一种非常经典的数据结构——红黑树,红黑树相对于跳表来说,虽然时间复杂度都是O(log n),但是红黑树的使用场景相对更广泛一些,在早期的Linux内核中就一直存在红黑树的实现,也运用在了更高效的多路复用器Epoll中。 所以,红黑树是每一个程序员不得不会的知识点,甚至有些变态的面试官,还会让你手写红黑树的一部分实现,比如左旋、右旋、插入平衡的过程、删除平衡的过程,这些内容非常复杂,靠死记硬背往往很难彻底掌握。 彤哥也是一直在寻找一种红黑树的记忆法,总算让我找到了那么一种还算不错的方式,从红黑树的起源出发,理解红黑树的本质,再从本质出发,彻底掌握不用死记硬背的方法,最后再把它手写出来。 从本节开始,我也将把这种方法传递给你,因此,红黑树的部分,我会分成三个小节来讲解: 从红黑树的起源,到红黑树的本质 从红黑树的本质,找到不用死记硬背的方法 不靠死记硬背,手写红黑树 好了,下面我们就进入第一小节。 红黑树的起源 二叉树

挫折中成长——数据分析师面经

[亡魂溺海] 提交于 2021-01-10 12:48:58
作者介绍 @小宇 专注流量数据分析,就职过360和58。 主要负责流量分析和商业变现等相关数据分析工作。 临近春节很多同学在暗暗盘算 “拿到年终奖要不要看看机会?”、“金三银四招聘季就要来了,要不要?”、“某大厂放出的这个岗位好心动啊”…… 在这个蠢蠢欲动的时候,一个从业 2400 天的分析师小前辈,来给大家介绍一下数据分析师岗位的面(cuo)试(zhe)经(gu)验(shi)。 跳槽前大家总是踌躇满志、兴奋且焦虑,也是最爱看书的时候!为了心中的小目标,我们到底该准备些什么? 01 简历突出的要点是? 第一点一句话介绍求职优势。在简历的开头一定要用一句话介绍自己的求职优势,突出重点,在简历筛选环节脱颖而出。如 “2 年用户增长数据分析经验”,“0-1 搭建增长指标体系、监控框架”,“熟悉用户增长分析模型构建方法”。 第二点经验介绍,说 “做了什么事?为什么做?结果是什么?”。有些同学会觉得是不是少了“怎么做?”,答案是否定的。简历中的每项内容不宜过长,不要赘述过多细节,给面试官留出提问点,在问答环节着重介绍实现方法即可。 第三点项目介绍,包含项目背景、承担角色、通过哪些手段达成了怎样的结果。选择的项目切记是自己贡献度高的、有显著成果的,而不是曾参与过的最大的项目。有的同学会描述出一个优秀的项目,那么面试官一定会问哪些工作是你做的?对项目的贡献度有多少?如果参与不够深入、贡献度低

了解红黑树的起源,理解红黑树的本质

戏子无情 提交于 2021-01-10 12:40:52
关注公众号“彤哥读源码”,解锁更多源码、基础、架构知识! 前言 本文收录于专辑:http://dwz.win/HjK,点击解锁更多数据结构与算法的知识。 你好,我是彤哥。 前面两节,我们一起学习了关于跳表的理论知识,并手写了两种完全不同的实现,我们放一张图来简单地回顾一下: 实现跳表的关键之处是在有序链表的基础上加上各层索引,通过这些索引可以做到O(log n)的时间复杂度快速地插入、删除、查找元素。 说起跳表,我们就不得不提另一种非常经典的数据结构——红黑树,红黑树相对于跳表来说,虽然时间复杂度都是O(log n),但是红黑树的使用场景相对更广泛一些,在早期的Linux内核中就一直存在红黑树的实现,也运用在了更高效的多路复用器Epoll中。 所以,红黑树是每一个程序员不得不会的知识点,甚至有些变态的面试官,还会让你手写红黑树的一部分实现,比如左旋、右旋、插入平衡的过程、删除平衡的过程,这些内容非常复杂,靠死记硬背往往很难彻底掌握。 彤哥也是一直在寻找一种红黑树的记忆法,总算让我找到了那么一种还算不错的方式,从红黑树的起源出发,理解红黑树的本质,再从本质出发,彻底掌握不用死记硬背的方法,最后再把它手写出来。 从本节开始,我也将把这种方法传递给你,因此,红黑树的部分,我会分成三个小节来讲解: 从红黑树的起源,到红黑树的本质 从红黑树的本质,找到不用死记硬背的方法 不靠死记硬背

时间复杂度、空间复杂度

三世轮回 提交于 2021-01-10 12:04:04
前言 为了让广大读者轻松学习,完全理解内容表达含义。我会用最通俗易通的方式结合图文表达,让每位读者完全熟记每种数据结构和算法的优缺点!今天我们分享的是时间复杂度和空间复杂度,因为只要讲到数据结构与算法,就一定离不开时间、空间复杂度分析。 时间复杂度 首先,什么是时间复杂度?简单的讲就是指执行这个算法所需要的执行时间,分为事先统计法和事后统计法,事后统计法就是通过一些监控,指标,来评估算法的时间复杂度,但是这样算法的执行时间,会受到很多因素的影响,例如硬件、运行时环境、数据规模等。所以我们采用事前统计法来评估一个算法不依赖于其他环境因素的影响下的效率。 大 O 复杂度表示法 大O复杂度表示法是指 所有代码的执行时间 T(n) 与每行代码的执行次数 n 成某种有规律的函数 。例如以下例子一: int count(int n) { int sum = 0; for (int j = 0; j <= n; ++j) { sum = sum + j; } } 上图代码中,假如每行代码的执行一次的时间为一个单位的time,那么第三行1个time,第4,5行都运行了n次,那么总执行时间就是T(n)=(2n+1)time,通过公式我么你可以看出, 所有代码的执行时间 T(n) 与每行代码的执行次数 n 成正比,即T(n) = O(f(n)),T(n) 表示代码执行的时间;n 表示数据规模的大小;f

华为面经之我的同学是个死神

吃可爱长大的小学妹 提交于 2021-01-10 10:58:31
  废话不说,直奔主题。   人物背景:小吴,我的同学,本硕985,计算机系,编程与吹水能力俱佳,曾徒手撕数据结构并凭三寸不烂之舌骗到我同导师的小美人做女票,性格贱萌,五官三观均未跑偏。   故事概况:秋招提前批,面试屡被怼,怼得稀烂那种。曾创下被百度hr亲自打电话告知面挂、撕出代码被阿里面试官火速回绝等辉煌战绩。昨儿个,这位小吴同学向我取了华为面经,得知不难后,今日一脸轻松隆重出席了华为优招之厦门专场面试。只是没想到这次面试,又为他的面试珍集画上了浓墨重彩的一笔。   据小吴同学轻松愉快地口述,本宝端上了这碗热腾腾的面筋,与君共食。此轮面试官为6号,为方便简称H666,嗯,这样起名就是为了对齐。面试岗位据说是云计算,此文根据聊天整理,与事实多无出入,版权没有,翻版不究。   -----------------------------------------------这是条面筋直播卖萌线-------------------------------------------------   ......此处省略一堆我不知道的管他重不重点.......   H666:简历我来看一下,做云计算是吧?那我来问你几个C++的问题吧。   小吴:(嘿嘿这个我拿手)嗯嗯嗯嗯....   H666:你先说一下 C++和C比有啥区别?多了啥?   小吴:(信心满满)多了面向对象和重载。  

算法面经之华为

寵の児 提交于 2021-01-10 10:25:46
一、华为   这周华为来厦门优招两天,本狗子有幸排到了第一天的上午,因此无需焦急取经,虚实一探便知。刚结束面试小伙伴们就叽叽喳喳来问面试官问了啥子到底难不难之类的,为了节约党和人民的宝贵时间,遂写下面经,人手一份,勿争勿抢。   直接进入正题。   一面的面试官是个面相忠厚的老实人,oh no,太不礼貌了重新说,是个...好人。有点像高三时的化学老师,全程面带微笑,所以也没啥压力。下面简称一轮面试官为H1吧,这样比较简洁也显得对称。   H1:你好~   我:您好您好~   H1:嗯,你先自我介绍一下吧。   我:嗯嗯好的,巴拉巴拉....巴拉巴拉差不多就是这样吧。   H1:项目巴拉巴拉...   我:巴拉巴拉...    .......(省略一些记不起来的巴拉巴拉)   H1:你用python是吧?   我:对的对的   H1:嗯嗯,那我问几个C++的问题。   我:???........好的。   H1:全局变量和局部变量?动态存储区?堆和栈在内存上的区别?要是我写一个类,不想被继承,那要怎么做呢?   我:巴拉巴拉static......?   H1:en....其实我想问的是构造函数和析构函数,不过没关系,问题不大问题不大。你觉得你们实验室最优秀的是谁啊?   我:我啊....此处省略自夸的噼里啪啦一段话。   H1:嗯嗯嗯,优秀优秀....再问个问题哈

算法面经之阿里巴巴

て烟熏妆下的殇ゞ 提交于 2021-01-10 10:09:37
一、阿里   概况: 一个措手不及就接到了阿里的电话,不得不说,大公司的面试官是真的很有礼貌,很厉害,又不盛气凌人,答不出来的时候还会耐心给解答。刚被百度打击过,这次面阿里直接说了自己的缺点,感觉有点太脆弱了。面试官给了很中肯的学习建议,感觉很温暖,还留了微信,过不过都是开心的。   建议: C++一些基础还是要复习一下,深度学习的话主要是深刻理解思想。   1.faster rcnn的RPN和ROI pooling?   2.单阶段和两阶段的优缺点?   3.神经网络的反向传播机制?pooling和卷积。   4.C++的多态?   5.C++的动态库和静态库?   6.引用和值传递?   7.计算连通域的个数?算法复杂度?   8.C++的模板?   9.非极大值抑制?   10.各种损失函数?0-1损失?   ---------------------------------------------   过了半个月居然再次接到阿里的电话,喜出望外。   本来也是对阿里不报希望了,一来觉得一面面的不够好,起码绝不属于大牛级别,而且一开始就坦言了自己的缺点,在我心里绝对应该挂了,没想到又被捞出来涮了一遍。真的很感谢阿里一面的面试官了,说是我好好看一下C++,下次还会问,没想到真的这次又问了,而且给留了半个月的时间复习,奈何自己不争气,以为面试官也就客气客气,还是没咋地看C++

从零开始学习java一般需要多长时间?

☆樱花仙子☆ 提交于 2021-01-10 09:01:45
从零开始学习java一般需要多长时间? 其实学 java一般要多久?因人而异,例如一个零基础的小白自学java,每天学习8个小时来算,而且在有学习资料的基础上,每天学习,从零到找到工作,起码要半年起步,而且还要有项目经验,否则是不会有公司要你的。而一个有一些基础的人,在经过有人系统的教学后,是可以很快学会掌握java的,大概3个月左右。 不过 java相对于C,C++java而言,java无疑简单了很多,不需要指针,不需要销毁对象,使得对java初学者来讲更容易入门,挫折感也少。 很多人自学 java,因为抓不到学习java的重点,找不到学习java的方向。往往花费大量的时间和精力,而效果却不大。面试IT企业office时或者参与真正的项目开发忽然发现自己一无所知。 我认为正确的学习路径应该是一个月 java基础,两个月JavaSE,半个月html+css+div,一个月的数据库,servlet+jsp一个月,然后SSH框架两个月。然后通起来串一遍,把知识结合起来,再做几个项目练练手,就差不多了。(其实学习java 基础部分需要时间不止一个月,至于说不止一个月,是需要你将java 基础部分完全明白,能够串起来综合运用,甚至需要两遍三遍;之所以这么说,不是为了说java 有多难,而是为了强调基础有多重要。) 我想要告诉你的是学习 Java不难,但是也会很艰辛的敲代码

深度解析Redis之Redis事务

时光怂恿深爱的人放手 提交于 2021-01-10 07:36:46
Redis事务的概念: Redis 事务的本质是一组命令的集合。事务支持一次执行多个命令,一个事务中所有命令都会被序列化。在事务执行过程,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求不会插入到事务执行命令序列中。 总结说:redis事务就是一次性、顺序性、排他性的执行一个队列中的一系列命令。 Redis事务没有隔离级别的概念: 批量操作在发送 EXEC 命令前被放入队列缓存,并不会被实际执行,也就不存在事务内的查询要看到事务里的更新,事务外查询不能看到。 Redis不保证原子性: Redis中,单条命令是原子性执行的,但事务不保证原子性,且没有回滚。事务中任意命令执行失败,其余的命令仍会被执行。 Redis事务的三个阶段: 开始事务 命令入队 执行事务 Redis事务相关命令: watch key1 key2 … : 监视一或多个key,如果在事务执行之前,被监视的key被其他命令改动,则事务被打断 ( 类似乐观锁 ) multi : 标记一个事务块的开始( queued ) exec : 执行所有事务块的命令 ( 一旦执行exec后,之前加的监控锁都会被取消掉 ) discard : 取消事务,放弃事务块中的所有命令 unwatch : 取消watch对所有key的监控 //加入Java开发交流君样:756584822一起吹水聊天 Redis事务使用案例: (1

16张图带你彻底搞懂基数排序

◇◆丶佛笑我妖孽 提交于 2021-01-10 06:23:05
点击上方 蓝字 关注我们 前言 在排序算法中,大家可能对桶排序、计数排序、基数排序不太了解,不太清楚其算法的思想和流程,也可能看过会过但是很快就忘记了,但是不要紧,幸运的是你看到了本篇文章。本文将通俗易懂的给你讲解基数排序。 基数排序,是一种原理简单,但实现复杂的排序。很多人在学习基数排序的时候可能会遇到以下两种情况而浅尝辄止: 一看原理,这么简单,懂了懂了(顺便溜了) 再一看代码,这啥啥啥啊?这些的肯定有问题(不看溜了) image-20201113205712629 要想深入理解基数排序,必须搞懂基数排序各种形式(数字类型、等长字符类型、不等长字符)各自实现方法,了解其中的联系和区别,并且也要掌握空间优化的方法(非二维数组而仅用一维数组)。下面跟着我详细学习基数排序吧! 基数排序原理 首先百度百科看看基数排序的定义: 基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,基数排序法的效率高于其它的稳定性排序法。 基数排序也称为卡片排序,简而言之,基数排序的原理就是多次利用计数排序(计数排序是一种特殊的桶排序),但是和前面的普通桶排序和计数排序有所区别的是