算法和数据结构
大厂面试必备之算法和数据结构
小齐酱
从金融到科技,这里有女程序员的技术分享;从纽约到北京,这里有我的程序人生。愿成长路上有你相伴️
展开
-
有关链表的小技巧,我都给你总结好了
链表链表是数据结构里一个很基础但是又很爱考的线性结构,链表的操作相对来说比较简单,但是非常适合考察面试者写代码的能力,以及对 corner case 的处理,还有指针的应用很容易引起 NPE (null pointer exception)。综合以上原因,链表在面试中很重要。提到链表就不得不提数组,它和数组可以说是数据结构的基础,那么它们最主要的区别在于:数组在物理内存上必须是连续的链表在物理内存上不需要连续,通过指针连接所以数组最好的性质就是可以随机访问 random access,有了 ind原创 2020-10-22 09:51:36 · 391 阅读 · 0 评论 -
排序算法入门之「选择排序」
选择排序选择排序也是利用了“挡板法”这个经典思想。挡板左边是已排序区间,右边是未排序区间,那么每次的“选择”是去找右边未排序区间的最小值,找到之后和挡板后面的第一个值换一下,然后再把挡板往右移动一位,保证排好序的这些元素在挡板的左边。比如之前的例子:{5, 2, 0, 1}我们用一个挡板来分隔数组是否排好序,用指针 j 来寻找未排序区间的最小值;第一轮 j 最初指向 5,然后遍历整个未排序区间,最终指向 0,那么 0 就和挡板后的第一个元素换一下,也就是和 5 交换一下位置,挡板向右移动一..原创 2020-10-21 08:36:07 · 189 阅读 · 1 评论 -
排序算法入门之「插入排序」
插入排序借用《算法导论》里的例子,就是我们打牌的时候,每新拿一张牌都会把它按顺序插入,这,其实就是插入排序。齐姐声明:虽然我们用打牌的例子,但是可不能学胡适先生啊。对于数组来说怎么做呢?有一个重要的思想,叫做挡板法,就是用挡板把数组分成两个区间:挡板左边:已排序挡板右边:未排序那么排序分三步走:最初挡板是在数组的最左边,index = 0 的位置,也就是保证了已排序区间里一个数都没有,或者也可以包含一个数啦;核心思想就是:依次遍历未排序区间里的元素,在已排序区间里找到正确的...原创 2020-10-20 09:44:39 · 281 阅读 · 0 评论 -
不可不会的「反转链表」问题
反转链表这题真的是面试非常喜欢考的了,这题看起来简单,但是能用两种方法一遍 bug free 也是不容易的,面试的时候可以筛下来一大批人,无论是对 junior 还是 senior 面试都很爱考。今天齐姐就带你梳理清楚思路,思路清楚了才能写码如有神。题目这是从力扣中文站上截下来的,但是这个输出不太形象。对链表的反转,并不是要把它实际翻个个,只是动一动 next 指针就好了。什么意思呢?我们先看对数组进行反转。数组是一个物理上连续存储的数据结构,反转之后原来放 1 的位置就变成了放 5..原创 2020-10-19 08:28:08 · 211 阅读 · 0 评论 -
为什么堆化 heapify() 只用 O(n) 就做到了?
heapify()前面两篇文章介绍了什么是堆以及堆的两个基本操作,但其实呢,堆还有一个大名鼎鼎的非常重要的操作,就是 heapify() 了,它是一个很神奇的操作,可以用 O(n) 的时间把一个乱序的数组变成一个 heap。但是呢,heapify() 并不是一个 public API,看:所以我们没有办法直接使用。唯一使用 heapify() 的方式呢,就是使用PriorityQueue(Collection<? extends E> c)这个 constructor 的时候,人原创 2020-10-19 08:10:20 · 952 阅读 · 1 评论 -
Java 集合看这一篇就够了
大家好,这里是《齐姐聊数据结构》系列之大集合。话不多说,直接上图:Java 集合,也称作容器,主要是由两大接口 (Interface) 派生出来的:Collection 和 Map顾名思义,容器就是用来存放数据的。那么这两大接口的不同之处在于:Collection 存放单一元素;Map 存放 key-value 键值对。就是单身狗放 Collection 里面,couple 就放 Map 里。(所以你属于哪里?学习这些集合框架,我认为有 4 个目标:明确每个接口和类的对应关系;对原创 2020-10-15 10:21:21 · 270 阅读 · 0 评论 -
入职大厂,齐姐精选的 9 道 Java 集合面试题
Java 集合框架其实都讲过了,有一篇讲 Collection 的,有一篇讲 HashMap 的,那没有看过的小伙伴快去补下啦,文末也都有链接;看过的小伙伴,那本文就是检测学习成果的时候啦今天这篇文章是单纯的从面试的角度出发,以回答面试题为线索,再把整个 Java 集合框架复习一遍,希望能帮助大家拿下面试。先上图:当面试官问问题时,我会先把问题归类,锁定这个知识点在我的知识体系中的位置,然后延展开来想这一块有哪些重点内容,面试官问这个是想考察什么、接下来还想问什么。这样自己的思路不会混乱,还能预测原创 2020-10-10 10:36:09 · 878 阅读 · 0 评论 -
一分钟了解堆的基本操作
基本操作任何一个数据结构,无非就是增删改查四大类:功能方法时间复杂度增offer(E e)O(logn)删poll()O(logn)改无直接的 API删 + 增查peek()O(1)这里 peek() 的时间复杂度很好理解,因为堆的用途就是能够快速的拿到一组数据里的最大/最小值,所以这一步的时间复杂度一定是 O(1) 的,这就是堆的意义所在。那么我们具体来看 offer(E e) 和 poll() 的过程。offer(E e)比如我们新原创 2020-10-07 09:39:24 · 1341 阅读 · 0 评论 -
一分钟带你读懂什么是堆?
上一篇的 「Java 集合框架」里,还剩下一个大问题没有说的,那就是 PriorityQueue,优先队列,也就是堆,Heap。什么是堆?堆其实就是一种特殊的队列——优先队列。普通的队列游戏规则很简单:就是先进先出;但这种优先队列搞特殊,不是按照进队列的时间顺序,而是按照每个元素的优先级来比拼,优先级高的在堆顶。这也很容易理解吧,比如各种软件都有会员制度,某软件用了会员就能加速下载的,不同等级的会员速度还不一样,那就是优先级不同呀。还有其实每个人回复微信消息也是默默的把消息放进堆里排个序:先回男朋原创 2020-10-06 08:27:12 · 1772 阅读 · 0 评论 -
从 LRU Cache 带你看面试的本质
前言 大家好,这里是《齐姐聊算法》系列之 LRU 问题。在讲这道题之前,我想先聊聊「技术面试究竟是在考什么」这个问题。技术面试究竟在考什么在人人都知道刷题的今天,面试官也都知道大家会刷题准备面试,代码大家都会写,那面试为什么还在考这些题?那为什么有些人代码写出来了还挂了?大家知道美国的大厂面试 80%是在考算法,这其实是最近 5-10 年以谷歌、雅虎为首才兴起的;国内大厂对于算法的考察虽然没有这么狂热,但也越来越重视了。那么算法面试真的只是在考算法吗?显然不是。本质上考的是思考问题的方式,分析、原创 2020-09-24 07:56:52 · 7651 阅读 · 1 评论 -
一文学懂递归和动态规划
前言大家好,这里是《齐姐聊算法》系列之递归和 DP 问题。递归,是一个非常重要的概念,也是面试中非常喜欢考的。因为它不但能考察一个程序员的算法功底,还能很好的考察对时间空间复杂度的理解和分析。本文只讲一题,也是几乎所有算法书讲递归的第一题,但力争讲出花来,在这里分享四点不一样的角度,让你有不同的收获。时空复杂度的详细分析 识别并简化递归过程中的重复运算披上羊皮的狼 适当炫技助我拿到第一份工作算法思路大家都知道,一个方法自己调用自己就是递归,没错,但这只是理解递归的最表层的理解。原创 2020-09-21 08:37:38 · 2115 阅读 · 4 评论 -
拓扑排序就这么回事
前言大家好,这里是《齐姐聊算法》系列之拓扑排序问题。Topological sort 又称 Topological order,这个名字有点迷惑性,因为拓扑排序并不是一个纯粹的排序算法,它只是针对某一类图,找到一个可以执行的线性顺序。这个算法听起来高大上,如今的面试也很爱考,比如当时我在面我司时有整整一轮是基于拓扑排序的设计。但它其实是一个很好理解的算法,跟着我的思路,让你再也不会忘记她。有向无环图刚刚我们提到,拓扑排序只是针对特定的一类图,那么是针对哪类图的呢?答:Directed acyc原创 2020-09-17 07:52:15 · 845 阅读 · 0 评论 -
必考算法之 Top K 问题
大家好,这里是《齐姐聊算法》系列之 Top K 问题。Top K 问题是面试中非常常考的算法题。8Leetcode 上这两题大同小异,这里以第一题为例。题意:给一组词,统计出现频率最高的 k 个。比如说 “I love leetcode, I love coding” 中频率最高的 2 个就是 I 和 love 了。有同学觉得这题特别简单,但其实这题只是母题,它可以升级到系统设计层面来问:在某电商网站上,过去的一小时内卖出的最多的 k 种货物。我们先看算法层面:思路:统计下所原创 2020-09-16 07:45:00 · 808 阅读 · 0 评论 -
有关 HashMap 面试会问的一切
前言大家好,本篇文章是《齐姐说数据结构》系列的第三篇,更多数据结构和算法的文章已经整理在我的 Github 上了:https://github.com/xiaoqi6666/NYCSDEHashMap 是无论在工作还是面试中都非常常见常考的数据结构。比如 Leetcode 第一题 Two Sum 的某种变种的最优解就是需要用到 HashMap 的,高频考题 LRU Cache 是需要用到 LinkedHashMap 的。HashMap 用起来很简单,底层实现也不复杂,先来看几道常见的面试题吧。相信大原创 2020-09-15 07:39:33 · 657 阅读 · 0 评论 -
看了齐姐这篇文章,再也不怕面试问树了
在写完了所有线性数据结构之后,今天开启非线性数据结构系列。我们今天先来看,什么是“树”。树是由顶点和边组成的且不存在环的数据结构。作为一个应用非常广的数据结构,不仅在工作中常用,在面试中也非常常考。一是因为树的结构天然决定了它和递归联系紧密,很多树相关的算法题都非常适合用递归来解;二是因为它的难度介于链表和图之间,非常适合在 45 分钟的面试里进行考察,所以一场面试中遇到两三轮问树都是再正常不过的了。本文先来讲树的基础内容,分为以下小节,每个小节开头都会有思维导图和对应的 Leetcode 算法题原创 2020-08-11 10:04:08 · 4915 阅读 · 2 评论 -
漫画:史上最生动的「归并排序」
那我们借用 cs50 里的例子,比如要把一摞卷子排好序,那用并归排序的思想是怎么做的呢?首先把一摞卷子分成两摞;把每一摞排好序;把排好序的两摞再合并起来。感觉啥都没说?那是因为上面的过程里省略了很多细节,我们一个个来看。首先分成两摞的过程,均分,奇偶数无所谓,也就是多一个少一个的问题;那每一摞是怎么排好序的?答案是用同样的方法排好序。排好序的两摞是怎么合并起来的?这里需要借助两个指针和额外的空间,然后左边画一个彩虹????右边画个龙????,不是,是左边拿一个数,右原创 2020-05-30 09:36:40 · 976 阅读 · 0 评论 -
这才是面试官想听的:详解「递归」正确的打开方式
前言递归,是一个非常重要的概念,也是面试中非常喜欢考的。因为它不但能考察一个程序员的算法功底,还能很好的考察对时间空间复杂度的理解和分析。本文只讲一题,也是几乎所有算法书讲递归的第一题,但力争讲出花来,在这里分享四点不一样的角度,让你有不同的收获。时空复杂度的详细分析识别并简化递归过程中的重复运算披上羊皮的狼适当炫技助我拿到第一份工作算法思路大家都知道,一个方法自己调用自己...原创 2020-04-27 09:11:39 · 4422 阅读 · 0 评论 -
一文七图搞懂面试常考算法「拓扑排序」
前言Topological sort 又称 Topological order,这个名字有点迷惑性,因为拓扑排序并不是一个纯粹的排序算法,它只是针对某一类图,找到一个可以执行的线性顺序。这个算法听起来高大上,如今的面试也很爱考,比如当时我在面我司时有整整一轮是基于拓扑排序的设计。但它其实是一个很好理解的算法,跟着我的思路,让你再也不会忘记她。有向无环图刚刚我们提到,拓扑排序只是针对特定的...原创 2020-04-27 09:09:24 · 820 阅读 · 0 评论 -
有关 HashMap 面试会问的一切
前言HashMap 是无论在工作还是面试中都非常常见常考的数据结构。比如 Leetcode 第一题 Two Sum 的某种变种的最优解就是需要用到 HashMap 的,高频考题 LRU Cache 是需要用到 LinkedHashMap 的。HashMap 用起来很简单,底层实现也不复杂,先来看几道常见的面试题吧。相信大家多多少少都能回答上来一点,不清楚的地方就仔细阅读本文啦~这篇文章带你深...原创 2020-04-23 05:13:48 · 2607 阅读 · 0 评论 -
用一道「二分查找」面试最常考题来给你拜年了!
用一道「二分查找」面试最常考题来给你拜年了!今天第一题选了我最喜欢的也是折磨了我很久的但并不算难的题目,最终是因为在 GS 电面中被问到了,我才痛下决心把这类题目一网打尽。先来看最基本版的题目:Leetcode 153题题干是给了一个【本来排好序了的 且为升序】的数组,然后又在某个不知道的位置旋转了一下,所谓旋转,就是把前面那堆数移到后面来了,求新数组的最小值。比如:原 array:[0...原创 2020-01-26 03:26:58 · 1328 阅读 · 0 评论