程序员面试指南——数据结构
本专栏跟进程云老师的程序员面试指南,对数据结构进行分析
flying_1314
2025持续分享前沿文章~敬请期待~
当前主要侧重,图神经网络,大模型相关论文讲解,后续大家如果有感兴趣的方向,欢迎评论区讨论
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
位操作-按位与之如何求二进制数的1个数
题目今天和大家分享一个题,求这个一个数的二进制有多少个1题解这个题挺有意思的,是通过按位与的操作,来判断多少个1比如 输入为5, 二进制 101,有两个15&(5-1)=5&4=101&100=100(4)然后 继续循环4&(4-1)=4&3=100&011=000(0)循环结束做了两次与操作,有两个1注意:这里的&是按位与操作,所以会将十进制数转化成二进制数操作.本提原理在于,按8举例,8如果-1,那么是7原创 2020-12-06 16:39:14 · 498 阅读 · 1 评论 -
链表问题16——单链表的选择排序(python版本)
题目给定一个无序单链表头节点head,实现单链表的选择排序要求:额外空间复杂度为O(1),时间复杂度O()思路 选择排序是从未排序的部分中找到最小值,然后放在排好序部分的尾部。开始整个链表都是未排序部分,找都整个链表的最小值点即为新的头节点 在未排序的部分中找到最小值的节点,然后在未排序部分删除这个节点,并连接到排好序部分的队尾 返回头节点代码...原创 2020-07-23 18:48:31 · 739 阅读 · 0 评论 -
笔试题——max pooling滑动窗口实现(python 代码)
题目输入:从控制台获取n,m,a,b;其中n*m为矩阵大小,a*b为滑动窗口大小 矩阵中的值,通过(i*j)mod 10 得到, 在滑动过程中,需要获得每次滑动窗口中的最大值,并存储下来 输出:所有最大值的和要求及思路纯暴力求解法,时间复杂度过高,需要使用滑动窗口方法求解 题目为2维矩阵,所以需要对行和列依次使用滑动窗口方法即可 不了解滑动窗口的可以参考一维滑动窗口这篇文章源...原创 2020-04-21 16:47:24 · 1428 阅读 · 0 评论 -
链表问题20——按照左右半区的方式重新组合单链表
题目给定一个单链表的头部节点head,链表长度为N,如果N为偶数,那么前N/2个节点算作左半区,后N/2个节点算作右半区;如果N为奇数,那么前N/2个节点算作左半区,后N/2+1个节点算作右半区。左半区从左到右依次为L1->L2->L3->...., 右半区从左到右依次记为R1->R2->..., 请将单链表调整成L1->R1->L2->R2-&...原创 2020-01-22 11:31:38 · 243 阅读 · 0 评论 -
链表问题19——合并两个有序的单链表
题目给定两个有序单链表的头节点head1和head2,请合并两个有序链表,合并后的链表依然有序,并返回合并后链表的头节点。思路本题较为简单,假设两个链表的长度分别为M和N,直接给出时间复杂度为O(M+N),额外空间复杂度为O(1)的具体过程:若其中一个链表为空,无序合并,返回另一个链表的头节点即可 比较head1和head2,小的那个记为head,另一个链表的所有节点都会插入he...原创 2020-01-22 10:18:08 · 671 阅读 · 3 评论 -
链表问题18——向有序的环形单链表中插入新节点
题目一个环形链表从头节点开始的顺序为不降序的顺序,也就是如1->2->2->2->3->4这样的链表叫做不降序,同时由最后的节点指回头节点。给定这个环形单链表的头节点head和一个整数num,要生成节点值为num的新节点,并插入环形链表中,保证依然有序。思路本题题目不难,但一定要考虑全面生成新的节点node,节点值为num 如果链表为空,node自己...原创 2020-01-20 11:00:16 · 363 阅读 · 0 评论 -
链表问题17—— 一种怪异的节点删除方式
题目给定一个链表中的节点node,但不给定整个链表的头节点。如何在链表中删除node?其中链表节点值的类型为int型要求:时间复杂度O(1)思路思路比较简单,将当前给定节点node的值修改为下一个节点的value,然后删除下一个节点。举例如下链表1->2->3->null,要删除节点2,但是现在只知道节点2并不知道头节点,并且只有next指针,此时就是将节点2...原创 2020-01-20 10:36:52 · 204 阅读 · 0 评论 -
链表问题16——单链表的选择排序
题目给定一个无序单链表头节点head,实现单链表的选择排序要求:额外空间复杂度为O(1),时间复杂度O()思路选择排序是从未排序的部分中找到最小值,然后放在排好序部分的尾部。开始整个链表都是未排序部分,找都整个链表的最小值点即为新的头节点 在未排序的部分中找到最小值的节点,然后在未排序部分删除这个节点,并连接到排好序部分的队尾 返回头节点源码public stati...原创 2020-01-20 10:25:05 · 433 阅读 · 0 评论 -
链表问题15——将搜索二叉树转换成双向链表(方法二)
题目题目同上一篇文章,即题目将二叉树按照中序顺序转换成双向链表思路方法二:利用递归函数,不使用任何容器。时间复杂度为O(N),额外空间复杂度为O(h),h为二d d d df叉树的高度首先需要一个新的类,来返回有序双向链表的头节点和尾节点,ReturnTpye类 先将以X为头节点的左子树转换为有序双向链表,再将X的右子树转换为有序双向链表,通过X把两部分连接即可 具体实现看下面...原创 2020-01-16 19:31:32 · 213 阅读 · 0 评论 -
链表问题15——将搜索二叉树转换成双向链表
题目将一颗搜索二叉树按照中序遍历(左-中-右)的顺序,变成一个有序的双向链表。所谓的先序遍历、中序遍历和后序遍历都针对的是中间的节点也就是根节点,先序遍历为中-左-右,后序遍历为左-右-中思路方法一:用队列作容器,时空复杂度均为O(N)生成一个队列queue,按中序顺序遍历二叉树,并放入queue中 依次从queue中弹出节点,并按弹出顺序重连即可。源码public ...原创 2020-01-16 19:14:20 · 200 阅读 · 0 评论 -
链表问题14——在单链表种删除指定值的节点(方法二)
题目题目可参考上一篇文章,删除链表中的指定值思路方法二:不用任何容器,直接调整。时间复杂度O(N),空间复杂度O(1)因为最后计划返回链表头,所以先遍历链表按顺序找到第一个不等于num的节点作为head 当遇到等于num的节点就删除,通过pre.next=cur.next;源码public class Node{ public int value; public No...原创 2020-01-15 13:25:11 · 330 阅读 · 0 评论 -
链表问题14——在单链表种删除指定值的节点
题目给定一个链表的头节点head和一个整数num,实现函数将值为num的节点全部删除。原链表 删除后链表 1->2->3->4->null, num=3 1->2->4->nulll 思路方法一:利用栈,时空复杂度均为O(N)将值不等于num的节点按链表顺序压栈 遍历完链表再依次弹栈,重新连接即可。源码pu...原创 2020-01-15 13:20:46 · 368 阅读 · 0 评论 -
链表问题13——删除无序单链表中值重复出现的节点(方法二)
题目同上一篇题目,本篇介绍方法二类似于选择排序的过程,时间复杂度为O(),额外空间复杂度为O(1),思路按顺序遍历节点 先是记录当前节点,然后去查看后面是否还有重复,有的话删掉,直到遍历完 然后重复2过程,直到遍历完链表源码public class Node{ public int value; public Node next; public Node(int da...原创 2020-01-14 22:33:32 · 320 阅读 · 0 评论 -
链表问题13——删除无序单链表中值重复出现的节点
题目给定一个无序单链表的头节点head,删除其中值重复出现的节点。原链表 删除后 1->2->3->3->4->2->4->1 1->2->3->4 要求:方法一:时间复杂度O(N)方法二:额外空间复杂度O(1)思路方法一:利用哈希表先将头节点加入哈希表中 依次遍历链表节点,每次先查看...原创 2020-01-14 22:22:54 · 436 阅读 · 0 评论 -
链表问题12——将单链表的每K个节点之间逆序(方法二)
题目题目同上一篇方法一中的题目。思路方法二:在原链表中调整用变量记录每一组开始的第一个节点,最后一个节点,然后逆序即可。源码public class Node{ public int value; public Node next; public Node(int data){ this.value=data; } }public Node revers...原创 2020-01-13 16:57:30 · 249 阅读 · 0 评论 -
链表问题12——将单链表的每K个节点之间逆序
题目给定一个单链表的头节点head,实现函数,使得每K个节点之间逆序,如果最后不够K个节点一组,则不调整最后几个节点。1->2->3->4->5->6->7->8->null K=3 3->2->1->->6->5->4->7->8->null 7,8不调整,因为不够一组...原创 2020-01-13 16:27:14 · 499 阅读 · 0 评论 -
链表问题11——两个单链表相交的系列问题(四):总结
题目请实现一个函数,如果两个链表相交,请返回相交的第一个节点,如果不相交,返回null即可。链表可能有环或无环。要求如果链表1的长度为N,链表2的长度为M,时间复杂度达到O(M+N),额外空间复杂度请达到O(1).思路综合前三篇文章,即可。判断是否有环,有则返回入环节点,否则返回null 判断两个无环链表是否相交,有则返回第一个交点,否则返回null 判断两个有环链表是...原创 2020-01-11 11:15:56 · 193 阅读 · 0 评论 -
链表问题11——两个单链表相交的系列问题(三):判断两个有环链表是否相交
题目判断两个有环链表是否相交,相交则返回第一个相交节点,否则返回null在考虑此问题时,根据前面几篇文章的解法,我们已经得到了各自链表的入环节点,分别为loop1和loop2思路以下是问题三的具体解决过程:如果loop1==loop2,我们只需要考虑从链表1的头节点head1到loop1这一段与从链表2的头节点head2到loop2这一段中,在哪里第一次相交,这与问题二,前面一...原创 2020-01-11 10:55:45 · 394 阅读 · 0 评论 -
链表问题11——两个单链表相交的系列问题(二):找到两个无环链表的交点
题目判断两个无环链表是否相交,相交则返回第一个相交节点,否则返回null思路分别遍历链表1和链表2,最后一个节点分别即为end1和end2,长度分别记为len1和len2 如果end1不等于end2,则不相交,否则相交 比较len1和len2,哪一个链表长就先走|len1-len2|步,然后同步走,第一次会和的节点就是需要返回的节点源码public class Node{...原创 2020-01-10 15:59:21 · 303 阅读 · 2 评论 -
链表问题11——两个单链表相交的系列问题(一):找到有环链表的环入口节点
题目判断一个链表是否有环,如果有,则返回第一个进入环的节点,没有则返回null。思路如果一个链表没有环,那么遍历链表一定可以遇到链表的终点;如果链表有环,那么遍历链表就永远在环里转下去了。如何找到第一个入环节点,具体过程如下:设置一个慢指针slow和一个快指针fast。slow每次走一步,fast每次走两步,遍历链表。 如果链表无环,fast一定会先到终点,并返回null。 如...原创 2020-01-10 14:08:16 · 230 阅读 · 0 评论 -
链表问题10——两个单链表生成相加链表(方法二)
题目假设链表中每一个节点的值都在0-9之间,链表整体代表一个整数。给定两个这种链表的头节点,请生成代表两个整数相加值的结果链表。链表1 链表2 生成的新链表 9->3->7 6->3 1->0->0->0 思路有一种实现方式是先分别算出两个链表所代表的整数,然后求出两个整数的和,最后将这个和转换成链表的形式。但是...原创 2020-01-09 10:26:07 · 308 阅读 · 0 评论 -
链表问题10——两个单链表生成相加链表
题目假设链表中每一个节点的值都在0-9之间,链表整体代表一个整数。给定两个这种链表的头节点,请生成代表两个整数相加值的结果链表。链表1 链表2 生成的新链表 9->3->7 6->3 1->0->0->0 思路有一种实现方式是先分别算出两个链表所代表的整数,然后求出两个整数的和,最后将这个和转换成链表的形式。但是...原创 2020-01-09 10:04:15 · 722 阅读 · 0 评论 -
链表问题9——复制含有随机指针节点的链表(进阶)
题目具体题目信息可以参考上一篇文章。进阶:不使用额外的数据结构,只用有限几个变量,且在时间复杂度为O(N)内完成原问题要实现的函数。思路进阶解法不使用哈希表来保存对应关系,而只采用有限的几个变量完成所有功能。具体过程如下:1.遍历链表,对每个节点生成相应的副本节点,并将副本节点放入原链表中。原链表 步骤1之后 1->2->3->null ...原创 2020-01-08 11:15:04 · 211 阅读 · 0 评论 -
链表问题9——复制含有随机指针节点的链表(初阶)
题目public class Node{ public int value; public Node next; public Node rand; public Node(int data){ this.value=data; } }Node类中除了包含value和next指针,还有一个rand指针,该指针可能指向链表中的任意一个节点包括null。给定一个链表,需要...原创 2020-01-08 11:07:15 · 210 阅读 · 0 评论 -
链表问题8——将单向链表按某值划分成左边小、中间相等、右边大的形式(进阶)
题目给定一个单向链表头节点head,和一个整数pivot。实现一个调整链表的函数,将链表调整为左部分小于pivot,中间等于,右边大于pivot的。调整后的节点顺序要保持与原链表中节点的先后次序一致。进阶问题要求时间复杂度仍然为O(N), 额外空间复杂度为O(1)。思路进阶解法具体过程如下:1、将原链表中的所有节点依次分为三个链表,small,equal和big。链表7...原创 2020-01-07 15:40:45 · 396 阅读 · 0 评论 -
链表问题8——将单向链表按某值划分成左边小、中间相等、右边大的形式(初阶)
题目给定一个单向链表头节点head,和一个整数pivot。实现一个调整链表的函数,将链表调整为左部分小于pivot,中间等于,右边大于pivot的。对调整后的节点顺序没有更多的要求链表9->0->4->5->1 pivot=3 调整后:1->0->4->9->5,也可以是0->1->9->5->4与顺序无关...原创 2020-01-07 13:51:06 · 181 阅读 · 0 评论 -
链表问题7——判断一个链表是否为回文结构(进阶)
题目关于回文问题的题目在上一篇文章已经描述,读者可以查看上一篇文章,这篇文章详细描述进阶问题。进阶:如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1).思路通过改变链表右半区的结构,使得整个右半区反转,最后指向中间节点。原链表 新链表 1->2->3->2->1 1->2->3(3指向null)<-2&...原创 2020-01-06 15:24:47 · 257 阅读 · 0 评论 -
链表问题7——判断一个链表是否为回文结构
题目给定一个链表的头节点head,请判断该链表是否为回文结构。输入链表 输出 1->2->1 true 1->2->2->1 true 15->6->15 true 1->2->3 false 思路方法一:利用栈结构,遍历链表并将节点依次压入栈中,遍历完后,依次弹栈,如果一个链表...原创 2020-01-06 11:53:19 · 423 阅读 · 0 评论 -
链表问题6——环形单链表的约瑟夫问题(初阶)
题目据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到剩下最后一个人时,那个人可以选择自己的命运。这就是著名的约瑟夫问题。现在请用单向环形链表描述该...原创 2020-01-06 10:59:36 · 223 阅读 · 0 评论 -
链表问题5——反转部分单向链表
题目给定一个单向链表的头节点head,以及两个整数from和to,在单向链表上把第from个节点到第to个节点这一部分进行反转。输入 调整结果为 1->2->3->4->5->null, from=2,to=4 1->4->3->2->5->null 1->2->3->null, from=1...原创 2020-01-05 17:38:53 · 365 阅读 · 0 评论 -
链表问题4——反转双向链表
题目实现反转双向链表的函数要求如果链表长度为N,时间复杂度要求为O(N),额外空间复杂度要求为O(1).源码public class Node{ public int value; public Node next; public Node last; public Node(int data){ this.value=data; } }public No...原创 2020-01-04 20:50:53 · 233 阅读 · 0 评论 -
链表问题4——反转单向链表
题目实现反转单向链表的函数要求如果链表长度为N,时间复杂度要求为O(N),额外空间复杂度要求为O(1).源码public class Node{ public int value; public Node next; public Node(int data){ this.value=data; } }public Node reverseList(Node...原创 2020-01-04 20:47:42 · 259 阅读 · 0 评论 -
链表问题3——删除链表的a/b处的节点(进阶)
题目给定链表的头节点head,整数a和b,实现删除位于a/b处节点的函数。链表:1->2->3->4->5,假设a/b的值为r 如果r等于0,不删除任何节点 如果r在(0,1/5],删除节点1 如果r在(1/5,2/5],删除节点2 如果r在(2/5,3/5],删除节点3 如果r在(3/5,4/5],删除节点4 如果r在(4/5,1],删除节...原创 2020-01-04 19:55:58 · 227 阅读 · 0 评论 -
链表问题3——删除链表的中间节点(初阶)
题目给定链表的头节点head,实现删除链表的中间节点的函数。不删除任何节点 1—>2, 删除节点1 1—>2—>3,删除节点2 1—>2—>3—>4,删除节点2 1—>2—>3—>4—>5,删除节点3 思路找到要删除节点的前一个节点即可。源码public class Node{ public i...原创 2020-01-04 19:43:40 · 272 阅读 · 0 评论 -
链表问题2——在双链表中删除倒数第K个节点
题目实现一个函数,可以删除双链表中倒数第K个节点。要求如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1)。思路双链表的思路与前一篇文章单链表的思路基本一致,注意last指针的重连即可源码public class Node{ public int value; public Node next; public Node last; public...原创 2020-01-04 16:31:30 · 144 阅读 · 0 评论 -
链表问题2——在单链表中删除倒数第K个节点
题目实现一个函数,可以删除单链表中倒数第K个节点。要求如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1)。思路如果链表为空或者K值小于1,直接返回head即可,除此之外,从头遍历链表,并让K-1.链表和K值 走到的节点 K变化 1->2->3 K=4 链表不存在倒数第4个节点 1->2->3 3 2 1...原创 2020-01-04 16:27:48 · 889 阅读 · 0 评论 -
链表问题1——打印两个有序链表的公共部分
题目给定两个有序链表的头指针head1和head2,打印两个链表的公共部分。思路因为是有序链表假设从小到大,所以从两个链表的头开始进行如下判断:如果head1的值小于head2,则head1往下移动 如果head2的值小于head1,则head2往下移动 如果head1的值等于head2的值,则打印这个值,然后head1和head2都往下移动 head1或head2有任何一个...原创 2020-01-04 15:20:55 · 244 阅读 · 0 评论 -
栈与队列10——可见的山峰对数量
题目一个不含有负数的数组可以代表一圈环形山,每个位置的值代表山的高度。有两个方向:next方向(逆时针方向),last方向(顺时针)。山峰A和山峰B相互看见的条件为:如果A和B是同一座山,认为不能相互看见 如果A和B是不同的山,并且在环中相邻,认为可以相互看见 如果A和B是不同的山,并且在环中不相邻,假设两座山峰高度的最小值为min。如果A通过next或last方向到B的途中没...原创 2020-01-03 11:53:14 · 579 阅读 · 0 评论 -
栈与队列9——最大值减去最小值小于或等于num的子数组的数量
题目给定数组arr和整数num,共返回有多少个子数组满足如下情况:max(arr[i..j])-min(arr[i..j])<=nummax表示子数组arr[i..j]中的最大值,min表示最小值要求如果数组长度为N,请实现时间复杂度为O(N)的解法思路普通解法:双重for循环寻找所有的子数组,在循环内部,对每一个子数组遍历找到其中的最小值和最大值,时间复杂度为O...原创 2020-01-02 11:19:17 · 338 阅读 · 2 评论 -
栈与队列8——求最大子矩阵的大小
题目给定一个整形矩阵map,其中的值只有0和1,求其中全是1的所有矩形区域中,最大的矩形区域中1的数量,例如:1 1 1 0,其中最大的矩形区域有3个1,返回3.再如:1 0 1 11 1 1 11 1 1 0其中,最大的矩形区域有6个1,返回6解答如果矩阵大小为O(N*M),可以做到时间复杂度为O(N*M).矩阵切割:矩阵行数为N,对每行进行切割,以当前行为底...原创 2019-12-31 16:42:50 · 273 阅读 · 0 评论
分享