首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

程序员才看得明白的面试圣经

请参阅本指南最后列出的常用面试问题。 当然了,长远来看,我们都会死掉,所以我会把事情搞简单,说一些你绝对应该复习一下的关键概念。...一种典型的做法是,当在一个全排列数组中增加一个元素的时候,会形成一个新的、更大的数组,而旧数组中的元素也会被复制到新数组里。你应该在面试时做到完成一个动态数组。...快速模式下的指针可能会是一个位于前面的固定数值(它有助于确定列表有无循环,或者找到列表中的第k个元素),或者也可能会跳过慢速指针经过的多个结点(打个比方,如果快速指针的速度是慢速指针的两倍,那么当它到达列表末尾时...图论是一个非常宽泛的话题,所以很难知道一个人应该为一场面试去熟悉多少种图论算法,所以我只是列出了我认为可以覆盖90%图论问题的内容:你绝对必须知道该如何遍历一个图(深度优先或者广度优先),以及如何做拓扑排序...从有n个元素的集合中挑出k个元素,当k>n时,不存在相应的组合,否则这k个元素的组合的数量可以用下面的公式来表达: 当k时,从有n个元素的集合中挑出k个元素的组合形式数量的一般公式。

63110

魔咒词典(hash表)- HDU 1880

那么我们能不能综合两者的特性,做出一种寻址容易,插入删除也容易的数据结构?...答案是肯定的,这就是我们要提起的哈希表,哈希表有多种不同的实现方法,我接下来解释的是最常用的一种方法——拉链法,我们可以理解为“链表的数组”,如图: ?...缺点:它是基于数组的,数组创建后难于扩展,某些哈希表被基本填满时,性能下降得非常严重,所以程序员必须要清楚表中将要存储多少数据(或者准备好定期地把数据转移到更大的哈希表中,这是个费时的过程)。...当哈利听到一个魔咒时,你的程序必须告诉他那个魔咒的功能;当哈利需要某个功能但不知道该用什么魔咒时,你的程序要替他找到相应的魔咒。如果他要的魔咒不在词典中,就输出“what?”...Input 首先列出词典中不超过100000条不同的魔咒词条,每条格式为: [魔咒] 对应功能 其中“魔咒”和“对应功能”分别为长度不超过20和80的字符串,字符串中保证不包含字符“[”和“]”,且“]

81620
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    金九银十: 50 个JS 必须懂的面试题为你助力

    它允许你从内部函数访问外部函数的作用域。 在JS中,每次创建函数时都会创建闭包。 要使用闭包,只需在另一个函数内定义一个函数并暴露它。 问题16:列出一些内置方法及其返回的值。...indexOf() 它返回指定值第一次出现时调用字符串对象中的索引。 length() 它返回字符串的长度。 pop() 它从数组中删除最后一个元素并返回该元素。...innerText:从起始位置到终止位置的内容, 但它去除Html标签 问题 34:JS中的事件冒泡是什么 事件冒泡是HTML DOM API中事件传播的一种方式,当一个事件发生在另一个元素中的一个元素中...严格模式是在代码中引入更好的错误检查的一种方法。 当使用严格模式时,不能使用隐式声明的变量,或为只读属性赋值,或向不可扩展的对象添加属性。...这样做之后,当咱们试图引用一个被删除的foo属性时,结果是undefined。

    6.6K31

    50 个JS 必须懂的面试题为你助力金九银十

    它允许你从内部函数访问外部函数的作用域。 在JS中,每次创建函数时都会创建闭包。 要使用闭包,只需在另一个函数内定义一个函数并暴露它。 问题16:列出一些内置方法及其返回的值。...indexOf() 它返回指定值第一次出现时调用字符串对象中的索引。 length() 它返回字符串的长度。 pop() 它从数组中删除最后一个元素并返回该元素。...innerText:从起始位置到终止位置的内容, 但它去除Html标签 问题 34:JS中的事件冒泡是什么 事件冒泡是HTML DOM API中事件传播的一种方式,当一个事件发生在另一个元素中的一个元素中...严格模式是在代码中引入更好的错误检查的一种方法。 当使用严格模式时,不能使用隐式声明的变量,或为只读属性赋值,或向不可扩展的对象添加属性。...这样做之后,当咱们试图引用一个被删除的foo属性时,结果是undefined。

    4.8K30

    准备下次编程面试前你应该知道的数据结构

    常用的数据结构 我们首先列出最常用的数据结构,然后再挨个讲解: 数组 堆栈 队列 链表 树 图 字典树 哈希表 数组 数组是一种最简单和最广泛使用的数据结构,其它数据结构比如堆栈和队列都源自数组。...——获取数组内所有元素的总数 常问的数组面试问题: 找到数组中第二小的元素 找到数组中第一个没有重复的整数 合并两个分类数组 重新排列数组中的正值和负值 堆栈 我们都熟悉很有名的撤销(Undo)选项,它几乎存在每个应用程序中...链表 链表是另一个重要的线性数据结构,刚一看可能看起来像数组,但在内存分配,内部结构以及如何执行插入和删除的基本操作方面有所不同。...链表就像一个节点链,其中每个节点包含数据和指向链中后续节点的指针等信息。有一个头指针,指向链表的第一个元素,如果列表是空的,那么它只指向 null 或不指向任何内容。...我和我的小伙伴们也会在星球里讲述如何制作算法动画、「LeetCode与剑指offer如何做题」等问题,也会定期举办「LeetCode刷题30天领红包」等活动,并且对于优质的内容,我会额外进行打赏,希望这个小组成为有活力的星球

    1.2K10

    Python语言中list及tuple的使用示例

    当索引超出范围时,Python会报一个IndexError错误,所以,要确保索引不要越界,记得最后一个元素的索引是len(classmates) - 1。...2.list追加或删除元素的方法 list是一个可变的有序表,所以,可以往list中追加元素到末尾: ? 也可以把元素插入到指定的位置,比如索引号为1的位置: ?...所以,只有1个元素的tuple定义时必须加一个逗号,,来消除歧义: ? Python在显示只有1个元素的tuple时,也会加一个逗号,,以免你误解成数学计算意义上的括号。...别急,我们先看看定义的时候tuple包含的3个元素: ? 当我们把list的元素'A'和'B'修改为'X'和'Y'后,tuple变为: ?...那就必须保证tuple的每一个元素本身也不能变。 本文小结 文中列举了两个Python内置的有序集合:list和tuple,其不同之处在于一个可变而另一个不可变。

    1.2K70

    python数组使用(超级全面)「建议收藏」

    定义方式:arr = {元素k:v} 2、下面具体说明这些数组的使用方法和技巧: (1) list 链表数组 a、定义时初始化 a = [1,2,[1,2,3]] b、定义时不初始化 一维数组...) 此外还有一种特殊的用法是: arr += [数组元素] 在不指定下标的情况下,是允许用 += 增加数组元素的。...定义方式:arr = {元素k:v} 2、下面具体说明这些数组的使用方法和技巧: (1) list 链表数组 a、定义时初始化 a = [1,2,[1,2,3]] b、定义时不初始化 一维数组...) 此外还有一种特殊的用法是: arr += [数组元素] 在不指定下标的情况下,是允许用 += 增加数组元素的。...定义方式:arr = {元素k:v} 2、下面具体说明这些数组的使用方法和技巧: (1) list 链表数组 a、定义时初始化 a = [1,2,[1,2,3]] b、定义时不初始化 一维数组:

    98520

    Robust generic functions on slices

    调用这些函数时,我们必须明确的是原始切片已经无效了,因为底层数组已经被修改。忽略返回值调用这些函数将是一个错误: slices.Delete(s, 2, 5) // incorrect!...这导致了可能引起显著性能问题的内存泄漏。 在上面的示例中,我们成功地从s[2:5]中删除了指针p2、p3 和p4,通过将一个元素左移。但是p3和p4仍然存在于底层数组中,超出了s的新长度。...不太明显的是,p5不是被删除的元素之一,但由于p5指针保留在数组的灰色部分中,其内存可能仍然泄漏。 如果开发人员不知道“不可见”元素仍在使用内存,可能会导致混淆。...在Go 1.22中,调用Delete后内存的情况如下: 体现在代码中,就是这五个函数中使用了新的内置函数clear[10](Go 1.21),将废弃的元素设置s的元素类型的零值: 当E是指针、切片、映射...测试验证 当切片函数被错误使用时,这一更改导致了一些在Go 1.21中通过的测试在Go 1.22中失败。这是个好消息。当你有一个 bug 时,测试应该能够提醒你。

    9510

    Redis原理 -基础数据结构

    Redis 基础数据结构 String 动态字符串,类似arraylist,当字符串长度消息1M时,扩容是加倍现有空间,超过1M,扩容时会多扩1M空间,字符串长度最大为512M ?...,当迁移完后,旧hash删除,内存回收 ?...Redis和hashmap的扩容不有的地方是采用了渐进式hash,渐进性的一点点迁移 ? hash 移除了最后一个元素,数据结构会被删除 ?...跳跃列表其实采用的是一个二分查找的一个方式 ? 我们需要这个链表按照 score 值进行排序。这意味着当有新元素需要插入时,要定位到特定位置的插入点,这样才可以继续保证链表是有序的。...通常我们会通过二分查找来找到插入点,但是二分查找的对象必须是数组,只有数组才可以支持快速位置定位,链表做不到,那该怎么办?想想一个创业公司,刚开始只有几个人,团队成员之间人人平等,都是联合创始人。

    46040

    居然还有布谷鸟过滤器,有何用处呢?

    二是,当你删除某一个数据包对应位图上的标志后,可能影响其他的数据包,例如上面例子中,如果删除数据包1,也就意味着会将bitmap1,3,6位设置为0,此时数据包2来请求时,会显示不存在,因为3,6两位已经被设置为...+1,当删除时就-1,这样就避免了普通布隆过滤器删除数据后需要重新计算其余数据包Hash的问题,但是依旧没法避免误判。...这时候布谷鸟哈希会设置一个阈值,当连续占巢行为超出了某个阈值,就认为这个数组已经几乎满了。这时候就需要对它进行扩容,重新放置所有元素。 还会有另一个问题,那就是可能会存在挤兑循环。...这两个hash函数选择的比较特殊,因为过滤器中只能存储指纹信息。当这个位置上的指纹被挤兑之后,它需要计算出另一个对偶位置。而计算这个对偶位置是需要元素本身的,我们来回忆一下前面的哈希位置计算公式。...实际上是需要的,但是布谷鸟过滤器强制数组的长度必须是2的指数,所以对数组的长度取模等价于取hash值的最后n位。在进行异或运算时,忽略掉低n位之外的其它位就行。

    56220

    Redis 之布隆过滤器与布谷鸟过滤器

    - 目录 - 大家都知道,在计算机中,IO一直是一个瓶颈,很多框架以及技术甚至硬件都是为了降低IO操作而生,今天聊一聊过滤器,先说一个场景: 我们业务后端涉及数据库,当请求消息查询某些信息时...当数组某位置被映射一次时就+1,当删除时就-1,这样就避免了普通布隆过滤器删除数据后需要重新计算其余数据包Hash的问题,但是依旧没法避免误判。...这时候布谷鸟哈希会设置一个阈值,当连续占巢行为超出了某个阈值,就认为这个数组已经几乎满了。这时候就需要对它进行扩容,重新放置所有元素。 还会有另一个问题,那就是可能会存在挤兑循环。...这两个 hash 函数选择的比较特殊,因为过滤器中只能存储指纹信息。当这个位置上的指纹被挤兑之后,它需要计算出另一个对偶位置。...实际上是需要的,但是布谷鸟过滤器强制数组的长度必须是 2 的指数,所以对数组的长度取模等价于取 hash 值的最后 n 位。在进行异或运算时,忽略掉低 n 位 之外的其它位就行。

    80620

    面试官再问currentHashMap,就将这篇文章甩给他

    是一个链表结构的元素, 每个Segment守护者一个HashEntry数组里的元素,当对HashEntry数组的数据进行修改时,必须首先获得它对应的Segment锁。...当并发级别为默认值16时,也就是段的个数,hash值的高4位决定分配在哪个段中。...假如哈希的质量差到极点,那么所有的元素都在一个Segment中,不仅存取元素缓慢,分段锁也会失去意义。我做了一个测试,不通过再哈希而直接执行哈希计算。...第一,当要删除的结点存在时,删除的最后一步操作要将count的值减一。这必须是最后一步操作,否则读取操作可能看不到之前对段所做的结构性修改。...这使得getFirst(hash)可能返回过时的头结点,例如,当执行get方法时,刚执行完getFirst(hash)之后,另一个线程执行了删除操作并更新头结点,这就导致get方法中返回的头结点不是最新的

    31610

    ConcurrentHashMap为什么比HashTable性能好

    当多个删除操作并发进行时,只要它们所在的段不相同,它们就可以同时进行。  由于put方法里需要对共享变量进行写入操作,所以为了线程安全,在操作共享变量时必须得加锁。...扩容的时候首先会创建一个两倍于原容量的数组,然后将原数组里的元素进行再hash后插入到新的数组里。为了高效ConcurrentHashMap不会对整个容器进行扩容,而只对某个segment进行扩容。...get操作不需要锁 除非读到的值是空的才会加锁重读,我们知道HashTable容器的get方法是需要加锁的,那么ConcurrentHashMap的get操作是如何做到不加锁的呢?...size()操作 如果我们要统计整个ConcurrentHashMap里元素的大小,就必须统计所有Segment里元素的大小后求和。...因为在累加count操作过程中,之前累加过的count发生变化的几率非常小,所以ConcurrentHashMap的做法是先尝试2次通过不锁住Segment的方式来统计各个Segment大小,如果统计的过程中

    1.3K30

    JAVA零基础小白学习免费教程day13-Collection&数据结构

    的next方法之前,迭代器的索引位于第一个元素之前,不指向任何元素,当第一次调用迭代器的next方法后,迭代器的索引会向后移动一位,指向第一个元素并将该元素返回,当再次调用next方法时,迭代器的索引会指向第二个元素并将该元素返回...每种数据结构有自己的优点和缺点,想想如果Google的数据用的是数组的存储,我们还能方便地查询到所需要的数据吗?而算法,在这么多的数据中如何做到最快的插入,查找,删除,也是在追求更快。...例如,子弹压进弹夹,先压进去的子弹在下面,后压进去的子弹在上面,当开枪时,先弹出上面的子弹,然后才能弹出下面的子弹。 栈的入口、出口的都是栈的顶端位置。 栈的名词 压栈:就是存元素。...每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。我们常说的链表结构有单向链表与双向链表,那么这里给大家介绍的是单向链表。...插入某一个节点,我们必须从根节点查找。

    7310

    c++容器类_类的容器

    什么是容器 首先,我们必须理解一下什么是容器,在C++ 中容器被定义为:在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对像的指针,这种对象类型就叫做容器。...容器还有另一个特点是容器可以自行扩展。在解决问题时我们常常不知道我们需要存储多少个对象,也就是说我们不知道应该创建多大的内存空间来保存我们的对象。显然,数组在这一方面也力不从心。...下表列出STL 定义的三类容器所包含的具体容器类: 标准容器类 特点 顺序性容器 vector 从后面快速的插入与删除,直接访问任何元素 deque 从前面或后面快速的插入与删除,直接访问任何元素...相当于数组,但其大小可以不预先指定,并且自动扩展。它可以像数组一样被操作,由于它的特性我们完全可以将vector 看作动态数组。...当存储的数据超过分配的空间时vector 会重新分配一块内存块,但这样的分配是很耗时的,在重新分配空间时它会做这样的动作: 首先,vector 会申请一块更大的内存块; 然后,将原来的数据拷贝到新的内存块中

    82610

    ArrayList源码解析

    代码执行到这里使我们知道,if语句中的代码只会执行一次,并且仅当ArrayList中的底层数组必须是空数组时,也就是没有被初始化时才会执行。...上面的代码貌似看点有复杂,我们暂时不用全部考虑,我只看最后一条代码即可,方法在最后调用了Arrays.copyOf()方法,我们知道该方法的作用是返回一个新数组,并将当前数组的内容拷贝到新数组中,并设置新数组的初始化大小...通过上面的分析,我们知道,ArrayList数组的默认模式初始化大小是10。也就是说如果ArrayList中底层数组如果不创建新数组的话,那么此集合最多能存储的元素大小就是10。...如果我们更新的是数组中中间的元素,那们处理时性能则会比较差,因为我们知道数组中的内存必须是连续的,所以底层处理时,会把这个元素后面的元素依次前移一位,所以会造成一些不必要的操作,损失性能。...但如果我们要更新的是数组中的最后一个元素时,则ArrayList的处理性能则会非常快,因为ArrayList的特性是检索快, 所以会很快查找到该元素,然后将该元素删除,但又因为是最后一个元素,所以不会执行前移操作

    34920

    ArrayList深度解析

    通过源码中查看到elementData属性是ArrayList的底层数组。...② 所以只要我们获取到当前ArrayList类中该字段的值就可以知道该集合当前底层数组的长度。 这里我使用了反射的机制,来强行获取elementData属性的值。...、当只是对集合进行初始化,而不添加任何元素的时候,集合的底层数组长度为0 2、当给集合添加 1 个元素,集合底层数组长度扩容10 3、当给集合添加 10 个元素,集合底层数组长度还是10 4、当给集合添加...11 个元素后,集合扩容为15,呈1.5倍增长 5、当给集合添加 16 个元素后,集合扩容为22,还是原数组的长度的1.5倍 2 ArrayList构造方法 ① 空参 空参构造方法初始化了一个空的数组...如果我们要在集合中添加一百万个数据,它只能是通过每次扩容1.5倍,每次将原数组数据放入新的数组,很明显非常消耗资源。

    23020

    Java面试基础必备知识点,怼死面试官,从我做起

    Java中static方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的。static方法跟类的任何实例都不相关,所以概念上不适用。...Java集合类里面最基本的接口有: Collection:代表一组对象,每一个对象都是它的子元素。 Set:不包含重复元素的Collection。...Iterator接口提供了很多对集合元素进行迭代的方法。每一个集合类都包含了可以返回迭代器实例的 迭代方法。迭代器可以在迭代的过程中删除底层集合的元素。...相对于ArrayList,LinkedList的插入,添加,删除操作速度更快,因为当元素被添加到集合任意位置的时候,不需要像数组那样重新计算大小或者是更新索引。...因为集合类实际上是数据结构,我们一般使用大O符号基于时间,内存和性能来选择最好的实现。大O符号可以对大量数据的性能给出一个很好的说明。 31.如何权衡是使用无序的数组 还是有序的数组?

    2.6K80

    Java面试基本问题

    数组列表不同步,因此速度很快。 向量很慢,因为它是线程安全的。 如果将元素插入“数组列表”,则它将其数组大小增加50%。 向量默认为其数组大小加倍。 数组列表未定义增量大小。 向量定义增量大小。...下面我列出了它的一些优点: 软件包有助于避免名称冲突 它们提供了更容易的代码访问控制 包还可以包含隐藏类,这些隐藏类对外部类不可见,仅在包内使用 创建适当的层次结构,使查找相关类更加容易   Q12...最终方法 当方法声明为final时,继承类不能覆盖该方法。 最终类 在Java中将一个类声明为final时,任何子类类都不能对其进行扩展,但可以扩展其他类。 Q22。...什么是Java中的无限循环?举例说明。 无限循环是Java中的一个指令序列,当不满足功能退出要求时,它会无限循环。这种类型的循环可能是编程错误的结果,也可能是基于应用程序行为的故意行为。...Java中的集合类是什么?列出其方法和接口。 在Java中,集合是一个框架,用作存储和操作一组对象的体系结构。使用集合可以执行各种任务,例如搜索,排序,插入,操作,删除等。

    1.1K50
    领券