随笔分类 - 高频面试系列
摘要:读完本文,你可以去力扣拿下如下题目: 372.超级次方 今天来聊一道与数学运算有关的题目,LeetCode 372 题 Super Pow,让你进行巨大的幂运算,然后求余数。 int superPow(int a, vector<int>& b); 要求你的算法返回幂运算 a^b 的计算结果与 13
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 146.LRU缓存机制 一、什么是 LRU 算法 就是一种缓存淘汰策略。 计算机的缓存容量有限,如果缓存满了就要删除一些内容,给新内容腾位置。但问题是,删除哪些内容呢?我们肯定希望删掉哪些没什么用的缓存,而把有用的数据继续留在缓存里,方便之后继续使用。那么,什么
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 25.K个一组翻转链表 之前的文章「递归反转链表的一部分」讲了如何递归地反转一部分链表,有读者就问如何迭代地反转链表,这篇文章解决的问题也需要反转链表的函数,我们不妨就用迭代方式来解决。 本文要解决「K 个一组反转链表」,不难理解: 这个问题经常在面经中看到,而
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 875.爱吃香蕉的珂珂 1011.在D天内送达包裹的能力 二分查找到底有能运用在哪里? 最常见的就是教科书上的例子,在有序数组中搜索给定的某个目标值的索引。再推广一点,如果目标值存在重复,修改版的二分查找可以返回目标值的左侧边界索引或者右侧边界索引。 PS:以上
阅读全文
摘要:KMP 算法(Knuth Morris Pratt 算法)是一个著名的字符串匹配算法,效率很高,但是确实有点复杂。 很多读者抱怨 KMP 算法无法理解,这很正常,想到大学教材上关于 KMP 算法的讲解,也不知道有多少未来的 Knuth、Morris、Pratt 被提前劝退了。有一些优秀的同学通过手推
阅读全文
摘要:说到密码,我们第一个想到的就是登陆账户的密码,但是从密码学的角度来看,这种根本就不算合格的密码。 为什么呢,因为我们的账户密码,是依靠隐蔽性来达到加密作用:密码藏在我心里,你不知道,所以你登不上我的账户。 然而密码技术认为,「保密」信息总有一天会被扒出来,所以加密算法不应该依靠「保密」来保证机密性,
阅读全文
摘要:先给大家讲个笑话乐呵一下: 有一天阿东到图书馆借了 N 本书,出图书馆的时候,警报响了,于是保安把阿东拦下,要检查一下哪本书没有登记出借。阿东正准备把每一本书在报警器下过一下,以找出引发警报的书,但是保安露出不屑的眼神:你连二分查找都不会吗?于是保安把书分成两堆,让第一堆过一下报警器,报警器响;于是
阅读全文
摘要:二分查找到底有能运用在哪里? 最常见的就是教科书上的例子,在 有序数组 中搜索给定的某个目标值的索引。再推广一点,如果目标值存在重复,修改版的二分查找可以返回目标值的左侧边界索引或者右侧边界索引。 PS:以上提到的三种二分查找算法形式在前文「二分查找详解」有代码详解,如果没看过强烈建议看看。 抛开有
阅读全文
摘要:我们之前有两篇文章写了回文串和回文序列相关的问题。 寻找 回文串的核心思想是从中心向两端扩展: 这道题的关键在于,单链表无法倒着遍历,无法使用双指针技巧。那么最简单的办法就是,把原始链表反转存入一条新的链表,然后比较这两条链表是否相同。关于如何反转链表,可以参见前文「递归操作链表」。 其实, 借助二
阅读全文
摘要:今天就来聊三道考察频率高,而且容易让人搞混的算法问题,分别是求子集(subset),求排列(permutation),求组合(combination)。这几个问题都可以用回溯算法解决。 一、子集 问题很简单,输入一个 不包含重复数字 的数组,要求算法输出这些数字的所有子集。 比如输入 ,你的算法应输
阅读全文
摘要:接雨水这道题目挺有意思,在面试题中出现频率还挺高的,本文就来步步优化,讲解一下这道题。 先看一下题目: 就是用一个数组表示一个条形图,问你这个条形图最多能接多少水。 下面就来由浅入深介绍暴力解法 备忘录解法 双指针解法,在 O(N) 时间 O(1) 空间内解决这个问题。 一、核心思路 我第一次看到这
阅读全文
摘要:之前也有文章写过几个有趣的智力题,今天再聊一道巧妙的题目。 题目非常简单: 给一个长度为 n 的数组,其索引应该在 ,但是现在你要装进去 n + 1 个元素 ,那么肯定有一个元素装不下嘛,请你找出这个缺失的元素。 这道题不难的,我们应该很容易想到,把这个数组排个序,然后遍历一遍,不就很容易找到缺失的
阅读全文
摘要:下文是我在 LeetCode 刷题过程中总结的三道有趣的「脑筋急转弯」题目,可以使用算法编程解决,但只要稍加思考,就能找到规律,直接想出答案。 一、Nim 游戏 游戏规则是这样的:你和你的朋友面前有一堆石子,你们轮流拿,一次至少拿一颗,最多拿三颗,谁拿走最后一颗石子谁获胜。 假设你们都很聪明,由你第
阅读全文
摘要:对括号的合法性判断是一个很常见且实用的问题,比如说我们写的代码,编辑器和编译器都会检查括号是否正确闭合。而且我们的代码可能会包含三种括号 ,判断起来有一点难度。 本文就来聊一道关于括号合法性判断的算法题,相信能加深你对 栈 这种数据结构的理解。 题目很简单,输入一个字符串,其中包含 六种括号,请你判
阅读全文
摘要:回文串是面试常常遇到的问题(虽然问题本身没啥意义),本文就告诉你回文串问题的核心思想是什么。 首先,明确一下什: 回文串就是正着读和反着读都一样的字符串 。 比如说字符串 和 都是回文串,因为它们对称,反过来还是和本身一样。反之,字符串 就不是回文串。 可以看到回文串的的长度可能是奇数,也可能是偶数
阅读全文
摘要:我把双指针技巧再分为两类,一类是「快慢指针」,一类是「左右指针」。前者解决主要解决链表中的问题,比如典型的判定链表中是否包含环;后者主要解决数组(或者字符串)中的问题,比如二分查找。 一、快慢指针的常见算法 快慢指针一般都初始化指向链表的头结点 head,前进时快指针 fast 在前,慢指针 slo
阅读全文
摘要:一、什么是 LRU 算法 就是一种缓存淘汰策略。 计算机的缓存容量有限,如果缓存满了就要删除一些内容,给新内容腾位置。但问题是,删除哪些内容呢?我们肯定希望删掉哪些没什么用的缓存,而把有用的数据继续留在缓存里,方便之后继续使用。那么,什么样的数据,我们判定为「有用的」的数据呢? LRU 缓存淘汰算法
阅读全文
摘要:cookie 大家应该都熟悉,比如说登录某些网站一段时间后,就要求你重新登录;再比如有的同学很喜欢玩爬虫技术,有时候网站就是可以拦截住你的爬虫,这些都和 cookie 有关。如果你明白了服务器后端对于 cookie 和 session 的处理逻辑,就可以解释这些现象,甚至钻一些空子无限白嫖,待我慢慢
阅读全文
摘要:素数的定义看起来很简单,如果一个数如果只能被 1 和它本身整除,那么这个数就是素数。 不要觉得素数的定义简单,恐怕没多少人真的能把素数相关的算法写得高效。比如让你写这样一个函数: 你会如何写这个函数?我想大家应该会这样写: java int countPrimes(int n) { boolean[
阅读全文
摘要:我最近在 LeetCode 上做到两道非常有意思的题目,382 和 398 题,关于水塘抽样算法(Reservoir Sampling),本质上是一种随机概率算法,解法应该说会者不难,难者不会。 我第一次见到这个算法问题是谷歌的一道算法题:给你一个 未知长度 的链表,请你设计一个算法, 只能遍历一次
阅读全文