
算法面试
算法面试
程序员徐师兄
程序员徐师兄、7年大厂程序员经历。全网粉丝30W+,Csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战,可以通过任意一篇文章底部联系我
展开
-
【Java】剑指offer(24)反转链表
方法一:使用三个指针(pre,p,next)进行实现。令p指向pre,next则是用于防止链表断裂(很简单,详见代码)。方法二(递归):找到最后一个结点作为返回值,递归函数中,找到最后的头结点后,开始进行每个结点next值的转换。1.与链表相关的题目总是涉及大量指针操作,以后遇到链表相关的题目时,多考虑指针的使用。定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。1.功能测试(链表有多个或一个结点)2.特殊测试(头结点为null)原创 2023-03-11 20:38:57 · 98 阅读 · 0 评论 -
【Java】剑指offer(23)链表中环的入口结点
2.相差n步的两个指针可以找到倒数第n个结点链表中倒数第k个结点:https://www.cnblogs.com/yongh/p/9788286.html)1.确定链表是否有环:通过两个不同速度的指针确定,当两个指针指向同一个结点时,该结点为环中的一个结点。3.找到环的入口:从头结点开始,通过两个相差为n的指针来得到(即寻找链表中倒数第n个结点)一个链表中包含环,如何找出环的入口结点?例如,在图3.8的链表中,环的入口结点是结点3。链表有多个或一个结点)2.确定环中结点的数目n:指针走一圈,边走边计数。原创 2023-03-11 20:39:45 · 95 阅读 · 0 评论 -
【Java】剑指offer(32)从上往下打印二叉树
根据当前层结点数目来打印当前层结点,同时计算下一层结点数目,之后令pCount等于nextCount,重复循环,直到打印完毕。(三)请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。(2)书中提供的方法:采用两个栈,对于不同层的结点,一个栈用于正向存储,一个栈用于逆向存储,打印出来就正好是相反方向。(二)从上到下按层打印二叉树,同一层的结点按从左到右的顺序打印,每一层打印到一行。1.功能测试(完全二叉树;原创 2023-03-09 21:42:46 · 432 阅读 · 0 评论 -
【Java】剑指offer(31)栈的压入、弹出序列
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。例如序列1、2、3、4、5是某栈的压栈序列,序列4、5、3、2、1是该压栈序列对应的一个弹出序列,但4、3、5、1、2就不可能是该压栈序列的弹出序列。建立一个栈,按照压栈序列依次进行入栈操作,按出栈序列的顺序依次弹出数字。在出栈时,若下一个要出栈的数字与栈顶数字相同则弹出。如果压栈序列中的所有数字都入栈后没有完全出栈成功则代表两个序列不匹配,返回false。出栈序列能实现栈的清空说明两个序列匹配。2.特殊测试(数组为空;原创 2023-03-09 21:42:00 · 85 阅读 · 0 评论 -
【Java】 剑指offer(30) 包含min函数的栈
最初想法是定义一个成员变量min来存放最小元素,但是当最小元素弹出后,min就需要相应改变,所以必须把每次的最小值都存储下来。定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min、push及pop的时间复杂度都是O(1)。(压入时,把每次的最小元素(之前最小元素与新入栈元素的较小值)保存起来放到辅助栈中)要学会这种情况下辅助栈的用法。辅助栈 3, 3,2,2,1。栈 3,4,2,5,1。4.弹出数字不是最小。原创 2023-03-06 23:45:41 · 319 阅读 · 0 评论 -
【Java】剑指offer(29)顺时针打印矩阵
2.在打印一圈时,单行或者单列情况只需要在从右往左打印和从下往上打印时判断是否会出现重复打印(即后面两个for循环)。每次打印矩阵的左上角的横纵坐标相同,即为start,而其余三个角的坐标都与行列数以及start有关,因此只需要for循环即可实现打印。当然,其实只要针对start进行循环判断, start*2的值小于行数和列数时才需要继续打印,这样,通过这个条件,可以用循环来打印每次的最外圈矩阵。3.打印矩阵的圈数与其列数或者行数的一半有关。多行多列,单行多列,多行单列,一个数的矩阵,空矩阵,null。原创 2023-03-06 23:44:20 · 392 阅读 · 0 评论