![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
面试基础算法题
码拉松
这个作者很懒,什么都没留下…
展开
-
关于二分查找的扩展题
前言在前一篇文章中经典二分查找的分析,我们理解了关于经典二分查找的方式和问题,相对来说经典的二分查找还是比较简单的,现在我们在经典的基础上,再看看二分查找的一些扩展题,就要稍微复杂一点了。1、查找第一个等于指定值的元素下标假设有这么一串数值:1, 2, 3, 3, 5, 6, 7, 8,要查找第一个3的位置,那么应该返回下标2 public int binarySearch(int[] nums, int target) { int l = 0; int r =原创 2021-09-16 19:01:37 · 161 阅读 · 0 评论 -
经典二分查找的分析
前言对于二分查找,也可以叫折半查找,你一定不会陌生,以前应该也有玩过猜价格的有戏,让你在某个价格区间内,猜某个商品的价格,如果没猜到就告诉你是猜多了还是猜少了,然后让你继续猜,这其实就可以运用到二分查找的方式来最快的猜到那个价格。高效的查找方式二分查找是一种非常高效的查找方式,对于一个2的32次方的数来说,大约有42亿之多,但由于二分查找拥有logn的时间复杂度,所以也就最多只需要32次就能查找出结果。简单但不容易二分查找虽然思路非常简单,但是要想写出正确的二分查找,其实并没有那么容易,这点我相信原创 2021-09-16 08:47:39 · 172 阅读 · 0 评论 -
基础算法面试题---实现二叉树的先、中、后序遍历
前言二叉树的先、中、后序遍历是非常经典的面试题,作为基础算法面试题必须要掌握。定义假设有这么一棵二叉树先序遍历:1、2、4、5、3、6、7(根-左-右)中序遍历:4、2、5、1、6、3、7(左-根-右)后序遍历:4、5、2、6、7、3、1(左-右-根)代码实现public class T_1 { List<Integer> preList = new ArrayList<>(); List<Integer> inList = new原创 2021-06-30 08:17:47 · 232 阅读 · 0 评论 -
基础算法面试题---异或运算II
前言最近在leetcode发现两道异或相关的题目,觉得挺好的,拿出来分享一下。异或满足的规律公式还是要清楚的1、归零率:a ^ a = 0(自己异或自己结果为0)2、恒等率:a ^ 0 = a(与0异或结果不变)3、交换律:a ^ b = b ^ a4、结合律:a ^ b ^ c = a ^ (b ^ c )第一题:解码异或后的数组(leetcode.1720)难度:简单题目中给出的encoded[i] 公式如下:encoded[i] = arr[i] XOR arr[i + 1]原创 2021-05-11 20:39:39 · 351 阅读 · 6 评论 -
算法面试题---利用双指针移除元素
前言当我们遇到移除元素的题目时,通常可以考虑使用双指针的方式来解,下面从leetcode上面总结了几道相关的题目,都是基础入门级别的,非常适合用来入门双指针相关操作的题目。1、移除元素给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。解题思路定义快慢指针,快指针遇到目标值,就跳过继续往下找原创 2021-04-19 11:56:59 · 235 阅读 · 0 评论 -
精心整理---与链表相关的算法题
前言关于链表的算法题,一般来说都不会非常的困难,主要考察的是编码能力,链表的逻辑比起其他算法题来说非常简单,但是往往想的很清楚,一写起来就容易乱,指针一不小心就不知道指哪去了。。。因此需要通过不断的练习才能找到感觉,本文整理了大量关于链表相关的题目,以供大家练习。基础篇基础篇是链表常见操作的实战练习,一定要熟练掌握基础,复杂的链表的操作基本上都是从基础操作中演化而来的1、反转链表2、删除链表节点3、删除链表中的重复元素I4、合并有序链表5、返回链表的中间节点6、相交链表7、从链表中删除给原创 2021-04-08 14:15:28 · 118 阅读 · 2 评论 -
链表算法面试题---分割链表
题目描述给定一个链表,和一个数值x,请对链表进行分割,使小于x的值全部放在x的左边。示例:5—4---6—2---8,x=5你可以分割成:2—4---5—6---82,4在5的左边。你也可以分割成:2—6---4—5---82,4在5的左边,尽管6大于5,且在5的左边,但你不用考虑大于5的值所在的位置。假设你分割成:2—5---4—6---8这样是不行的,因为4在5的右边了。本题的解法很多,通过此题,可以充分的练习到链表的一些基本操作解法1:双链表思路很简单,一个链表专门记录小于x的原创 2021-04-06 17:34:17 · 172 阅读 · 0 评论 -
链表算法面试题---合并N个有序链表
题目描述给定一个链表数组,数组中的每一个链表都是升序的,请你把数组中的所有链表按照升序的方式合并到一个链表中。示例:链表数组:【【0—>1】,【1—>2】,【2—>3】】最终结果:【0—>1—>1—>2—>2—>3】如果你有了前面合并两个有序链表的经验,那么本题暴力的方法就是遍历数组,统一看成两个链表合并的方式。暴力解法public class MergeMultipleLists { public static void main(S原创 2021-04-02 16:09:24 · 524 阅读 · 0 评论 -
链表算法面试题---链表的归并排序
题目描述给定一个链表,请用归并排序的方法,对链表完成排序。之前一道题中:链表的插入排序,我们完成了通过插入排序的方式对链表进行了排序,我们知道插入排序的时间复杂度是O(n^2),那么我们当然可以想到使用更快速的排序方式,所以本题尝试使用归并排序的方式来实现。归并排序分析归并的核心思想就是把一个大集合拆分为两个小集合,再分别对两个小集合进行拆分,直到不能拆分为止,然后对拆分后的小集合进行排序,排序完成后再向上合并,最终合并为一个有序的集合。那么在之前的基础题中,我们也遇到过如何对两个有序链表进行合并原创 2021-04-01 08:52:15 · 217 阅读 · 2 评论 -
链表算法面试题---链表的插入排序
题目描述给定一个链表,请用插入排序的方法,对链表完成排序。插入排序插入排序是一种稳定性排序,其主要思想就是把一个元素插入到一个已经排序好的数组中,整个过程就是一个元素找合适的插入位置,有点像打扑克牌的抓牌过程,抓一张牌然后插入到手上一堆牌中的合适位置。链表的插入排序链表插入排序的思路和普通数组的方式一样,我们让sortNode始终指向已经完成排序节点的最后一个位置,让insertNode始终指向待插入节点的位置,由于是插入排序,所以每次我们必须从头节点开始遍历,确认insertNode节点应该插入原创 2021-03-30 15:32:51 · 178 阅读 · 0 评论 -
链表算法面试题---交换链表的节点II
题目描述给定一个链表,和一个正整数值X,请你把链表的节点按照每X个进行交换,然后返回交换后的链表。如果剩余的节点不足X个,则不用交换。在之前我们做过的 交换链表的节点I中,是固定的两两交换,本题是它的升级版,交换的节点数,可动态传入。示例:解题思路:相比固定的两两节点交换,本题我们首先还是先考虑把链表按照X的值,进行划分多个子链表,然后利用反转链表的方式,最后再拼接回原链表。链表的题目一般对于算法思路上都比较容易理解,主要考验的还是编码的能力,本题看起来比较简单,实际对于编写的思路和技巧还是原创 2021-03-29 17:28:04 · 112 阅读 · 0 评论 -
链表算法面试题---交换链表的节点I
题目描述给定一个链表,请你把链表的节点进行两两交换,然后返回交换后的链表。如果只剩一个节点则不需要交换示例1:示例2:解题思路:把整个链表看成按照两两节点拆分的多个子链表,每个子链表完成交换后,再拼回原链表中即可。代码实现:public class SwapListNode { public static void main(String[] args) { SwapListNode c = new SwapListNode(); ListNode原创 2021-03-29 14:35:17 · 117 阅读 · 2 评论 -
链表算法面试题---旋转链表
题目描述给你一个链表的头节点,和一个值k,请把链表的每个节点向右移动k个位置。示例1:链表 1—2---3—4---5,k为2,向右移动1个位置,链表变为:5—1---2—3---4,再移动1个位置,链表变为:4—5---1—2---3示例2:链表 1—2---3,k为4,向右移动1个位置,链表变为:3—1---2,移动2个位置,链表变为:2—3---1,移动3个位置,链表变为:1—2---3,移动4个位置,链表变为:3—1---2链表的问题,解法总是非常多,反正就是绕来绕去,最后能正确链上就原创 2021-03-26 17:49:26 · 153 阅读 · 0 评论 -
链表算法面试题---合并两个链表
题目描述给你链表,分别为ListNode1和ListNode2,再给你m,n两个大于等于1的正整数,现在要求你把ListNode1的m到n位置的节点删除,并把删除的位置拼接上ListNode2。示例:ListNode1:1—>2—>3—>4—>5—>6ListNode2:7—>8m:2n:3也就是把ListNode1的3、4节点删除,最终得到:1—>2—>7—>8—>5—>6解题思路我们可以按照m、n的位置对ListNod原创 2021-03-25 17:26:38 · 130 阅读 · 0 评论 -
链表算法面试题---删除链表节点(给的不是头节点)
题目描述本题与一般的删除链表节点不太一样,一般删除链表节点都是给定头节点,和要删除的节点,而本题只给要删除的节点。如原始节点为:2—>5—>4—>7—>9,删除节点为5,也就是要删除第2个节点。满足条件:1、要删除节点一定不是尾节点。2、链表中至少包含2个节点。3、链表中节点的值都是唯一的。4、删除节点不强制要求删除节点所在的内存地址。本题难点在于,因为是单向链表,所以如果不给定头节点,也就意味着无法找到当前节点的前一个节点,所以需要转换思路,根据条件提示,其实我们只原创 2021-03-25 15:59:50 · 139 阅读 · 0 评论 -
链表算法面试题---环形链表II
题目描述给定一个链表,如果是环形链表则返回开始入环的第一个节点,如果不是环形链表,则返回null。如下图,节点3就是入环的第一个节点。本题是在基础判定是否为链表算法面试题—环形链表上的升级,同样如果你用set集合,则非常简单,第一次重复添加时,直接返回即可。解法看一下如何不借助其他数据结构来实现。首先还是先判断是否是环形链表,这个逻辑不变第二次第三次第四次第五次第六次,相遇之前判定是否为环形链表,到此就可以返回结果了,现在要返回节点3,此时我们只需要新建一个节点从头开始原创 2021-03-24 15:33:27 · 121 阅读 · 0 评论 -
链表算法面试题---环形链表
题目描述给定一个链表,判断是否有环。如下图,就是一个环形链表。解法1:你肯定很容易就能想到借助set集合的方式来实现,比如挨个遍历每个节点并放入set集合中,如果当前的节点在set集合中已经存在,则认为是环形链表,否则不是。public class HasCycle { public static void main(String[] args) { ListNode head = new ListNode(1); ListNode n1 = new L原创 2021-03-24 14:10:21 · 128 阅读 · 0 评论 -
链表算法面试题---删除链表倒数第N个节点
题目描述给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。解题思路由于单向链表没有指向前一个节点的指针,所以如果要删除倒数第N个节点,我们就必须先遍历一次链表,记录链表的长度,再遍历删除。解法1转换思路我们可以先将链表反转,这样一来题目就等于变成了删除正数第N个节点,那我们就可以直接遍历到第N个节点,然后原地删除,最后只需要再将链表反转回来即可。public class Code_19 { public static void main(String[] args)原创 2021-03-23 17:53:45 · 264 阅读 · 0 评论 -
链表算法面试题---从链表中删除给定的节点
注意:本题给定的节点即不是头节点也不是尾节点,请你实现删除比如:1—2---3—4---5—6,给你节点5,那么应该得到:1—2---3—4---6本题的难点在于无法直接从头或者从尾遍历链表,但是实际上你可以从给定的节点开始遍历到最后,那么就能找到尾节点,之后再将链表反转,然后就可以得到头节点,那么从头节点删除指定节点的方式相信你已经非常熟悉了。。当然,本题我采用另一种取巧的方式实现,两行代码搞定。public void deleteNode(ListNode node) { node.val原创 2021-03-23 17:01:41 · 90 阅读 · 0 评论 -
链表算法面试题---删除链表中的重复元素II
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中没有重复出现的数字。举例:原链表: 1->2->3->3->4->4->5删除后: 1->2->5解法1:结合删除重复节点和删除指定节点的方式,可以先删除重复节点,并记录下来重复节点的值,然后再删除指定节点的值即可。public class Code_06 { public static void main(String[] args) { Code_06 c原创 2021-03-23 16:45:40 · 251 阅读 · 0 评论 -
链表算法面试题---删除链表中的重复元素I
给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。举例:原链表: 1->1->2->3->3删除后: 1->2->3public class Code_05 { public static void main(String[] args) { Code_05 c = new Code_05(); ListNode n = new ListNode(); ListNode head = n;原创 2021-03-23 16:39:11 · 90 阅读 · 0 评论 -
链表算法面试题---回文链表
题目描述请判断一个链表是否是回文链表。进阶要求仅用O(n)的时间复杂度和O(1)的空间复杂度来实现。回文链表的定义1—>2—>3—>2—>1、1—>2—>2—>1这两个都是回文链表1—>2—>3—>2,不是回文链表解题思路我们可以借助其他数据结构来帮助我们实现,比如栈,这样明显简单的多。解法1因为栈结构先进后出的特点,我们可以挨个让链表的每一个节点入栈,再出栈比对即可。 public boolean isPalindro原创 2021-03-23 12:16:00 · 379 阅读 · 1 评论 -
链表算法面试题---返回链表的中间节点
题目描述给定一个非空链表的头节点,从该链表的中间节点开始返回。如果中间节点有两个,则返回第二个中间节点。示例1:1—>2—>3—>4—>5—>null,中间节点为3,所以返回3—>4—>5—>null。示例2:1—>2—>3—>4—>5—>6—>null,中间节点为3、4,根据要求返回第二个中间节点,所以返回4—>5—>6—>null解题思路题目本身比较简单,可以借助其他有下标的数据结构来完成原创 2021-03-19 17:04:06 · 235 阅读 · 2 评论 -
一道浪漫的链表面试题---相交链表
题目描述输入两个链表,找到两个链表的第一个相交节点示例:假设有两个链表分别为:链表A:1—>2—>3—>4 、链表B:5—>6—>7—>3—>4,那么它们的第一个相交节点就是节点31、如果两个链表没有交点,返回 null。2、原链表保持不变。3、整个链表结构中没有循环。4、程序要求满足 O(n) 时间复杂度,且仅用 O(1) 内存。解题思路分析假设:A节点长度为4,B节点长度为5,A/B同时出发,A遍历完自己的所有节点后,再遍历B的,B也同样遍历原创 2021-03-19 11:04:43 · 137 阅读 · 0 评论 -
链表算法面试题---反转链表 II
题目描述完成指定区间内的链表反转比如原链表为:1–>2–>3–>4–>5–>6–>null要求把位置从2到4的链表反转。所以反转结果为:1–>4–>3–>2–>5–>6–>null前置知识本题是反转整个链表的升级版,建议先了解下简单的反转整个链表的方式。基础算法面试题—反转链表基本思路在有了前面反转整个链表的基础上,只需稍作修改,我们的想法是如果能把待反转的链表的截取出来,完成反转后,再拼回去,不就可以了嘛也就是把2原创 2021-03-18 17:57:27 · 161 阅读 · 0 评论 -
常见算法题---归并排序的扩展
前言归并排序是一种建立在归并操作上的稳定性算法,是典型分治法的应用,把一个大的集合分成左右两个小的集合,然后分别排序两个小集合,最终再把已经排序好的集合合并成一个大集合。先简单看一下归并排序假设有如下一串数字 8 3 7 5 6 9 2 1每次都找到一个中间点,然后拆分,直到不能拆分为止一次合并过程结果合并过程主要依靠两个指针分别指向左边的开始处和右边的开始处,如果左边指针指向的的数小于右边指针指向的数,则记录左边的数,并把左边的指针向后移动一位,如果左边指针指向的的数大于右边指针指向的数原创 2021-02-26 15:52:34 · 149 阅读 · 0 评论 -
基础算法面试题---获取栈的最小值
前言来自程序员面试金典中的一道题目。题目描述请设计一个栈,除了常规栈支持的pop与push函数以外,还支持min函数,该函数返回栈元素中的最小值。执行push、pop和min操作的时间复杂度必须为O(1)。解题思路使用两个栈,一个是正常操作的栈,另一个则是让栈顶元素永远都是最小值的栈,这样就可以实现执行push、pop和min操作的时间复杂度都为O(1)。1、准备两个栈stack、minStack。2、操作元素添加x时,直接添加到stack栈中,然后再判断如果minStack栈不为空,且min原创 2021-02-10 21:49:38 · 298 阅读 · 2 评论 -
基础算法面试题---使用数组实现栈和队列
1、用数组实现栈数组实现栈还是比较简单的,只需要额外定义一个下标用来记录当前栈顶的位置即可。代码实现/** * 如何用数组实现栈 */public class ArrayImplStack { int[] arr = new int[5]; int index = 0; public void push(int x) { if (index == arr.length) { throw new RuntimeException原创 2021-02-09 21:52:22 · 202 阅读 · 2 评论 -
基础算法面试题---如何用队列实现栈(2)
前言在上一遍中,我们已经学会了如何用队列实现栈基础算法面试题—如何用队列实现栈(1),本文我们稍微转变一下思路,看一下第二种优化解法。解题思路当然还是需要两个队列来实现,与第一种解法不同的是,这次我们是在每次要添加元素时来交换队列中的元素,还是假设现在有两个队列分别为:A和B,当每次要弹出元素时都从A队列中弹出,而当要添加元素时,则先把当前要添加的元素添加到队列B中,再把A队列中的元素依次弹出并添加到B队列中,再交换A、B队列的角色。图解分析1、假设现在要添加一个元素1,先把1添加到队列B中。原创 2021-02-08 21:27:51 · 112 阅读 · 0 评论 -
基础算法面试题---如何用队列实现栈(1)
题目描述如何用队列结构实现栈的push和pop操作。队列和栈的概念队列:先进先出,从头进,从尾出。栈:先进后出,从头进,从头出。解题思路本题需要借助两个队列,通过让元素在两个队列中切换,来实现栈的功能。假设分别有A、B两个队列,以及一个int类型的标识符F,当要添加元素时,如果F等于0,则添加到队列A中,否则添加到队列B中,当要弹出元素时,如果F等于0,则先把队列A中的数据依次弹出并添加到队列B中,直到队列A中还剩最后一个元素时,则直接弹出,并设置F等于1,返回弹出元素。如果F等于1,则先把原创 2021-02-07 22:47:16 · 125 阅读 · 3 评论 -
基础算法面试题---如何用栈实现队列
题目描述如何用栈结构实现队列的push和pop操作。队列和栈的概念队列:先进先出,从头进,从尾出。栈:先进后出,从头进,从头出。解题思路一个栈是无法完成队列的,本题我们可以通过两个栈来实现,一个栈专门用来添加元素,另一个栈专门用来取出元素。假设分别设添加元素的栈为:A,取元素的栈为:B。每次数据都push到A栈中,当需要pop时,如果B栈为空,则一次性把用来A栈数据全部弹出并添加到B栈,否则直接从B栈弹出,这样即实现了队列的操作。图解分析1、假设现在要添加了3个元素,分别为:1,2,3原创 2021-02-06 21:29:40 · 229 阅读 · 6 评论 -
链表算法面试题---链表
前言一般链表的基础题算法都很简单,但却是常见的面试题,因为链表能够考察面试者的编码能力,往往很容易想到解题方式,却写不出来。下面总结了几道常见的初级题,可以反复练习,提高自己的编码能力。先准备两个对象,一个单链表,一个双链表单链表public class ListNode { int val; ListNode next; ListNode() { } ListNode(int val) { this.val = val; }原创 2021-02-04 14:59:35 · 283 阅读 · 4 评论 -
基础算法面试题---异或运算
异或运算异或是一个数学运算符,应用于逻辑运算,计算机符号为“eor”。在二进制中,规则为:1^0 = 11^1 = 00^0 = 0也就是相同为0,不同为1,也可以理解为不带进位的二进制加法。举例:5 ^ 3 = 65二进制:0 1 0 13二进制:0 0 1 1异或: 0 1 1 0 = 6异或满足的规律1、归零率:a ^ a = 0(自己异或自己结果为0)2、恒等率:a ^ 0 = a(与0异或结果不变)3、交换律:a ^ b = b ^ a4、结合律:a ^原创 2021-02-01 15:50:26 · 2353 阅读 · 14 评论 -
链表算法面试题---用链表实现队列和栈
队列和栈的概念队列:先进先出,从头进,从尾出。栈:先进后出,从头进,从头出。所以现在要做的就是用链表来实现:从头进,从头出,从尾进,从尾出这4种方法,即可组合出队列和栈的数据结构。假设以此插入1、2、3、4、5。1、从头进2、从尾进3、从头出,假设出2个元素4、从尾出,再出两个元素代码实现public class Code_02 { //双向链表 static class Node<T> { public T data;原创 2020-11-20 10:18:30 · 178 阅读 · 0 评论 -
链表算法面试题---删除链表节点
给定链表头节点,删除链表中所有含指定值的的节点。class Node { public Node next; public int value; public Node(int data) { value = data; }} public static Node removeNode(Node head, int value) { //先从头部节点开始找,找到值不为value的节点,跳出循环 while (head原创 2020-11-16 18:00:53 · 141 阅读 · 0 评论 -
链表算法面试题---反转链表
实现单链表和双链表反转单链表class Node { public Node next; public int value; public Node(int data) { value = data; }}双链表class DoubleNode{ public DoubleNode preNode; public DoubleNode nextNode; public int value; public Doub原创 2020-11-16 17:12:23 · 113 阅读 · 0 评论