
经典面试题
华山拎壶冲
不积跬步,无以至千里。。。
面试必备:https://www.jianshu.com/u/c3be0f69940b
展开
-
破坏单例模式的三种方式
单例模式的定义:单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例。在java中,单例模式我们常用的有三种(不晓得哪个天杀的说有七种,我懒得去找……)其实,我们在日常的应用中,会遇到这么一些问题:单例模式是怎么被破坏的?单例模式无坚不摧到底好不好?单例模式既然会被破坏有没有办法写一个无法破坏的单例模式?这一次我们会讨论关于单例模式的破坏以及单例模式的良性破坏和恶性破坏。首先我们了转载 2021-06-25 23:01:40 · 910 阅读 · 0 评论 -
二叉树、红黑树、B&B+树超齐全,快速搞定数据结构
前言没有必要过度关注本文中二叉树的增删改导致的结构改变,规则操作什么的了解一下就好,看不下去就跳过,本文过多的XX树操作图片纯粹是为了作为规则记录,该文章主要目的是增强下个人对各种常用XX树的设计及缘由的了解,也从中了解到常用的实现案例使用XX树实现的原因。数据在计算机中的存储结构主要为顺序存储结构、链式存储结构、索引存储结构、散列存储结构,其中链式存储结构最常见的示例是链表与树,链式存储结构主要有以下特点:优点:逻辑相邻的节点物理上不必相邻,插入、删除灵活,只需改变节点中的指针指向 缺点:存转载 2020-09-15 11:29:29 · 633 阅读 · 0 评论 -
一文学会回溯算法解题技巧
前言上文我们学习了深度优先搜索和广度优先搜索,相信大家对这两者的算法有了比较清楚的认识,值得一提的,深度优先算法用到了回溯的算法思想,这个算法虽然相对比较简单,但很重要,在生产上广泛用在正则表达式,编译原理的语法分析等地方,很多经典的面试题也可以用回溯算法来解决,如八皇后问题,排列组合问题,0-1背包问题,数独问题等,也是一种非常重要的算法。本文将会从以下几个方面来讲述回溯算法,相信大家看了肯定有收获!什么是回溯算法 回溯算法解题通用套路 经典习题讲解什么是回溯算法回溯算法本质其实就是转载 2020-09-09 10:28:05 · 669 阅读 · 0 评论 -
图解排序算法:快速排序
快速排序算法首先选一个基准 pivot,然后过一遍数组,把小于 pivot 的都挪到 pivot 的左边, 把大于 pivot 的都挪到 pivot 的右边。这样一来,这个 pivot 的位置就确定了,也就是排好了 1 个元素。然后对 pivot 左边 ???? 的数排序,对 pivot 右边 ???? 的数排序,就完成了。那怎么排左边和右边?答:同样的方法。所以快排也是用的分治法的思想。「分」选择一个 pivot,就把问题分成了pivot 左边 pivot 右转载 2020-09-04 14:16:42 · 324 阅读 · 0 评论 -
经典动态规划:打家劫舍系列问题
有好几位读者私下问我 LeetCode 「打家劫舍」系列问题(英文版叫 House Robber)怎么做,我发现这一系列题目的点赞非常之高,是比较有代表性和技巧性的动态规划题目,今天就来聊聊这道题目。打家劫舍系列总共有三道,难度设计非常合理,层层递进。第一道是比较标准的动态规划问题,而第二道融入了环形数组的条件,第三道更绝,让盗贼在二叉树上打劫,这就是传说中的高智商犯罪吧。。。下面,我们从第一道开始分析。House Robber Iimagepublic int rob(int[]转载 2020-09-03 14:20:58 · 381 阅读 · 0 评论 -
一文学会动态规划解题技巧
前言动态规划(dynamic programming,简称 dp)是工程中非常重要的解决问题的思想,从我们在工程中地图软件上应用的最短路径问题,再在生活中的在淘宝上如何凑单以便利用满减券来最大程度地达到我们合理薅羊毛的目的 ,很多时候都能看到它的身影。不过动态规划对初学者来说确实比较难,dp状态,状态转移方程让人摸不着头脑,网上很多人也反馈不太好学,其实就像我们之前学递归那样,任何算法的学习都是有它的规律和套路的,只要掌握好它的规律及解题的套路,再加上大量的习题练习,相信掌握它不是什么难事,本文将会用比转载 2020-09-02 15:42:41 · 344 阅读 · 0 评论 -
一文学会递归解题
前言递归是算法中一种非常重要的思想,应用也很广,小到阶乘,再在工作中用到的比如统计文件夹大小,大到 Google 的 PageRank 算法都能看到,也是面试官很喜欢的考点最近看了不少递归的文章,收获不小,不过我发现大部分网上的讲递归的文章都不太全面,主要的问题在于解题后大部分都没有给出相应的时间/空间复杂度,而时间/空间复杂度是算法的重要考量!递归算法的时间复杂度普遍比较难(需要用到归纳法等),换句话说,如果能解决递归的算法复杂度,其他算法题题的时间复杂度也基本不在话下。另外,递归算法的时间复杂度转载 2020-09-02 14:28:50 · 499 阅读 · 0 评论 -
拜托,别再问我什么是堆了!
前言堆是生产中非常重要也很实用的一种数据结构,也是面试中比如求 Top K 等问题的非常热门的考点,本文旨在全面介绍堆的基本操作与其在生产中的主要应用,相信大家看了肯定收获满满!本文将会从以下几个方面来讲述堆:生产中的常见问题 堆的定义 堆的基本操作 堆排序 堆在生产中应用生产中的常见问题我们在生产中经常碰到以下常见的问题:优先级队列的应用场景很广,它是如何实现的呢 如何求 Top K 问题 TP99 是生产中的一个非常重要的指标,如何快速计算可能你已经猜到了,以上生产上的高转载 2020-09-01 14:35:56 · 198 阅读 · 0 评论 -
图文详解 DFS 和 BFS
前言深度优先遍历(Depth First Search, 简称 DFS) 与广度优先遍历(Breath First Search)是图论中两种非常重要的算法,生产上广泛用于拓扑排序,寻路(走迷宫),搜索引擎,爬虫等,也频繁出现在 leetcode,高频面试题中。本文将会从以下几个方面来讲述深度优先遍历,广度优先遍历,相信大家看了肯定会有收获。深度优先遍历,广度优先遍历简介 习题演练 DFS,BFS 在搜索引擎中的应用深度优先遍历,广度优先遍历简介深度优先遍历深度优先遍历主要思路是从转载 2020-08-31 15:48:42 · 2568 阅读 · 0 评论 -
面试问你红黑树,你都懂了吗
红黑树(Red Black Tree)是一种自平衡的二叉搜索树(Self-balancing Binary Search Tree)。以前也叫做平衡二叉 B 树(Symmetric Binary B-tree)。预备知识树的知识框架结构如下图所示:image平衡二叉搜索树平衡二叉搜索树(Balanced Binary Search Tree),英文简称 BBST。经典常见的平衡二叉搜索树是 AVL 树和红黑树。①二叉搜索树二叉搜索树(Binary Search T..转载 2020-08-27 17:34:28 · 440 阅读 · 0 评论 -
算法题275:给定一个链表,返回链表开始入环的第一个节点
给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。说明:不允许修改给定的链表。示例 1:输入:head = [3,2,0,-4], pos = 1输出:tail connects to node index 1解释:链表中有一个环,其尾部连接到第二个节点。image示例 2:输入:head = [1转载 2020-08-27 16:43:46 · 478 阅读 · 0 评论 -
老生常谈,HashMap的死循环
问题最近的几次面试中,我都问了是否了解HashMap在并发使用时可能发生死循环,导致cpu100%,结果让我很意外,都表示不知道有这样的问题,让我意外的是面试者的工作年限都不短。由于HashMap并非是线程安全的,所以在高并发的情况下必然会出现问题,这是一个普遍的问题,虽然网上分析的文章很多,还是觉得有必须写一篇文章,让关注我公众号的同学能够意识到这个问题,并了解这个死循环是如何产生的。如果是在单线程下使用HashMap,自然是没有问题的,如果后期由于代码优化,这段逻辑引入了多线程并发执行,在一转载 2020-07-27 14:22:10 · 233 阅读 · 0 评论 -
HashMap? ConcurrentHashMap? 相信看完这篇没人能难住你!
前言Map 这样的Key Value在软件开发中是非常经典的结构,常用于在内存中存放数据。本篇主要想讨论 ConcurrentHashMap 这样一个并发容器,在正式开始之前我觉得有必要谈谈 HashMap,没有它就不会有后面的 ConcurrentHashMap。HashMap众所周知 HashMap 底层是基于数组 + 链表组成的,不过在 jdk1.7 和 1.8 中具体实现稍有不同。Base 1.71.7 中的数据结构图:先来看看 1.7 中的实现。...转载 2020-07-24 16:29:09 · 153 阅读 · 0 评论 -
既然有 HTTP 请求,为什么还要用 RPC 调用?
问:既然有 HTTP 请求,为什么还要用 RPC 调用?首先 RPC 框架配置复杂,如果走 HTTP 请求同样也能做到相同功能,而且配置可以几乎为零配置。项目也不用引用太多的包。虽然如果单纯用 RPC,可以不用类似于 Servlet 的 Web 标准。首先,实名赞扬题主的问题。这个问题非常好。其次,实名反对各个上来就讲RPC好而HTTP不好的答案。因为,题主的观点非常对。HTTP协议,以其中的Restful规范为代表,其优势很大。它可读性好,且可以得到防火墙的支持、跨语言的支持。而且,在去年转载 2020-07-03 14:26:20 · 247 阅读 · 0 评论 -
我画了35张图就是为了让你深入 AQS
前言谈到并发,我们不得不说AQS(AbstractQueuedSynchronizer),所谓的AQS即是抽象的队列式的同步器,内部定义了很多锁相关的方法,我们熟知的ReentrantLock、ReentrantReadWriteLock、CountDownLatch、Semaphore等都是基于AQS来实现的。我们先看下AQS相关的UML图:image思维导图(高清无损 AV 画质长图.pdf 关注公众号回复 AQS 获取)image1AQS实现原理AQS中 维护了转载 2020-07-01 16:13:34 · 212 阅读 · 0 评论 -
面试都在问的微服务,一文带你彻底搞懂!
单体式应用程序与微服务相对的另一个概念是传统的「单体式应用程序」( Monolithic application ),单体式应用内部包含了所有需要的服务。而且各个服务功能模块有很强的耦合性,也就是相互依赖彼此,很难拆分和扩容。在座的各位都写过单体程序,给大家举个栗子,刚开始写代码你写helloworld 程序就是单体程序,一个程序包含所有功能,虽然helloworld 功能很简单。单体应用程序的优点开发简洁,功能都在单个程序内部,便于软件设计和开发规划。 容易部署,程序单一不存在分布式集群转载 2020-06-29 14:58:02 · 499 阅读 · 0 评论 -
【高频 Redis 面试题】Redis 事务是否具备原子性?
一、事务的实现原理一个事务从开始到结束通常会经历以下三个阶段:1、事务开始客户端发送 MULTI 命令,服务器执行 MULTI 命令逻辑。服务器会在客户端状态(redisClient)的 flags 属性打开 REDIS_MULTI 标识,将客户端从非事务状态切换到事务状态。void multiCommand(redisClient *c) { // 不能在事务中嵌套事务 if (c->flags & REDIS_MULTI) { add.转载 2020-06-28 19:56:36 · 210 阅读 · 0 评论 -
从千万级数据查询来聊一聊索引结构和数据库原理
在日常工作中我们不可避免地会遇到慢SQL问题,比如笔者在之前的公司时会定期收到DBA彪哥发来的Oracle AWR报告,并特别提示我某条sql近阶段执行明显很慢,可能要优化一下等。对于这样的问题通常大家的第一反应就是看看sql是不是写的不合理啊诸如:“避免使用in和not in,否则可能会导致全表扫描”“ 避免在where子句中对字段进行函数操作”等等,还有一种常见的反应就是这个表有没有加索引?绝大部分情况下,加了个索引基本上就搞定了。既然题目是《从千万级数据查询来聊一聊索引结构和数据库原理》,首先就来转载 2020-06-28 17:15:43 · 277 阅读 · 0 评论 -
五分钟看懂一道中等难度的算法题
今天分享的题目来源于 LeetCode 第 450 号问题:删除二叉搜索树中的节点。虽然它的难度是 中等,但实际上很好理解,请往下看!题目描述给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。一般来说,删除节点可分为两个步骤: 首先找到需要删除的节点; 如果找到了,删除它。 说明:要求算法时间复杂度为 O(h),h 为树的高度。示例:root.转载 2020-06-24 15:40:37 · 619 阅读 · 0 评论 -
看完这篇Redis缓存三大问题,保你能和面试官互扯。
日常的开发中,无不都是使用数据库来进行数据的存储,由于一般的系统任务中通常不会存在高并发的情况,所以这样看起来并没有什么问题。一旦涉及大数据量的需求,如一些商品抢购的情景,或者主页访问量瞬间较大的时候,单一使用数据库来保存数据的系统会因为面向磁盘,磁盘读/写速度问题有严重的性能弊端,详细的磁盘读写原理请参考这一片[]。在这一瞬间成千上万的请求到来,需要系统在极短的时间内完成成千上万次的读/写操作,这个时候往往不是数据库能够承受的,极其容易造成数据库系统瘫痪,最终导致服务宕机的严重生产问题。为了克转载 2020-06-24 15:07:01 · 346 阅读 · 0 评论 -
面试官:说一下Zookeeper的ZAB协议?
前言Zab(Zookeeper Atomic Broadcast)是为ZooKeeper协设计的崩溃恢复原子广播协议,它保证zookeeper集群数据的一致性和命令的全局有序性。概念介绍在介绍zab协议之前首先要知道zookeeper相关的几个概念,才能更好的了解zab协议。集群角色Leader:同一时间集群总只允许有一个Leader,提供对客户端的读写功能,负责将数据同步至各个节点; Follower:提供对客户端读功能,写请求则转发给Leader处理,当Leader崩溃失联之后参与L转载 2020-06-18 14:40:33 · 401 阅读 · 0 评论 -
关于如何破坏单例的几种方式
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。是一种创建型设计模式。他的定义为:保证一个类仅有一个实例,并提供一个访问它的全局访问点。单例模式一般体现在类声明中,单例的类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。但是其实,单例并不是完完全全安全的,也是有可能被破坏的。以下,是一次面试现场的还原,之所以会聊到这个话题,是因为面试官问了我很多关于单例模式的问题,我回答的还可以,之转载 2020-06-18 11:41:35 · 1028 阅读 · 1 评论 -
面试官真是搞笑!让实现线程安全的单例,又不让使用synchronized!
单例模式,是Java中比较常见的一个设计模式,也是我在面试时经常会问到的一个问题。经过我的初步统计,基本上有60%左右的人可以说出2-4种单例的实现方式,有40%左右的人可以说出5-6种单例的实现方式,只有20%左右的人能够说出7种单例的实现。而只有不到1%的人能够说出7种以上的单例实现。其实,作为面试官,我大多数情况下之所以问单例模式,是因为这个题目可以问到很多知识点。比如线程安全、类加载机制、synchronized的原理、volatile的原理、指令重排与内存屏障、枚举的实现、反射与单转载 2020-06-11 16:24:15 · 183 阅读 · 0 评论 -
如何避免重复提交?分布式服务的幂等性设计!
来源:https://www.cnblogs.com/QG-whz/p/10372458.html作者:melonstreet为什么需要保证幂等性编程中的“幂等性”是指任意多次执行所产生的影响,与一次执行的影响相同。一个拥有幂等性设计的接口,保证无论一次或多次来调用接口,都能够得到相同的结果。接口的幂等性设计在某些场景下是必需的,例如用户下单的场景。我们知道,服务之间的调用存在三种状态:成功、失败、超时。超时是一种未知的状态:被调服务是否执行成功,这个状态是未知的。上游服务调用下游服务超时.转载 2020-06-11 15:35:04 · 322 阅读 · 0 评论 -
程序员要搞明白Nginx,这篇应该够了!
来源:https://www.cnblogs.com/wcwnina/p/8728391.html作者:melonstreetNginx的产生没有听过Nginx?那么一定听过它的"同行"Apache吧!Nginx同Apache一样都是一种WEB服务器。基于REST架构风格,以统一资源描述符(UniformResources Identifier)URI或者统一资源定位符(Uniform ResourcesLocator)URL作为沟通依据,通过HTTP协议提供各种网络服务。然而,这些服.转载 2020-06-10 15:16:47 · 299 阅读 · 0 评论 -
经典面试题:Redis 内存满了怎么办?
来源:https://juejin.im/post/5d674ac2e51d4557ca7fdd70作者:千山qiansanRedis占用内存大小我们知道Redis是基于内存的key-value数据库,因为系统的内存大小有限,所以我们在使用Redis的时候可以配置Redis能使用的最大的内存大小。1、通过配置文件配置通过在Redis安装目录下面的redis.conf配置文件中添加以下配置设置内存大小 //设置Redis最大占用内存大小为100M maxmemo..转载 2020-06-10 11:53:24 · 199 阅读 · 0 评论 -
面试问我,创建多少个线程合适?我该怎么说
你有一个思想,我有一个思想,我们交换后,一个人就有两个思想If you can NOT explain it simply, you do NOT understand it well enoughimage为什么要使用多线程?防止并发编程出错最好的办法就是不写并发程序image既然多线程编程容易出错,为什么它还经久不衰呢?A:那还用说,肯定在某些方面有特长呗,比如你知道的【它很快,非常快】我也很赞同这个答案,但说的不够具体并发编程适用于什么场景?如果问.转载 2020-06-09 14:52:24 · 199 阅读 · 0 评论