
剑指offer
雨纷飞_263
勤学如春起之苗,不见其增,日有所长;辍学如磨刀之石,不见其损,日有所亏。
展开
-
替换空格
题目描述:请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。解法:思路一:使用java自带的函数replace()public class Solution { public String replaceSpace(StringBuffer str) { ...原创 2019-09-11 18:34:30 · 175 阅读 · 0 评论 -
括号匹配
题目描述:给定一个只包括 '(',')','{','}','[',']'的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 注意空字符串可被认为是有效字符串。代码实现一:class Solution { public boolean isValid(String s) { Hash...原创 2019-09-19 23:33:37 · 279 阅读 · 0 评论 -
两个队列实现栈
题目描述:使用队列实现栈的下列操作:empty() -- 返回栈是否为空 push(x) -- 元素 x 入栈 pop() -- 移除栈顶元素 top() -- 获取栈顶元素思想:入栈push():哪个队列为空入哪个,都为空入qu1。最后usedSize++。出栈pop():若qu2不为空,先出usedSize-1个到qu1,此时qu2只剩一个数据,出队列即可。类似的...原创 2019-09-18 16:00:14 · 188 阅读 · 0 评论 -
复杂链表的复制(java实现)
题目描述:给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。要求返回这个链表的深拷贝。思路一:使用hash存储原结点和复制结点的映射关系,通过映射关系处理复制结点的random。(时间复杂度O(n),空间复杂度O(n))代码实现:class Solution { public Node copyRandomList...原创 2019-09-19 15:32:14 · 284 阅读 · 0 评论 -
删除链表中值为val的所有结点
题目描述:删除链表中等于给定值val的所有节点。思路:从前向后遍历链表,如果当前结点cur的值为val就删除。需要注意几点:如果头结点的值就是val,需要删除,那么头结点要向后移动。 注意判断条件的设置,如果当前结点cur需要删除,就要知道cur的上一个结点,因此条件可以设置为判断cur.next.val == val。图解:代码实现:class Sol...原创 2019-09-17 22:38:50 · 384 阅读 · 0 评论 -
合并两个有序链表
题目描述:将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。思想:新创建一个头结点,然后遍历两个链表比较每个结点的值大小,将值比较小的结点拼接,直到某个链表全部遍历完。此时还需判断另外一个链表是否遍历完,若没有还需拼接一次。图解:代码实现:class Solution { public ListNode merg...原创 2019-09-17 21:51:38 · 158 阅读 · 0 评论 -
判断链表是否相交
题目描述:编写一个程序,找到两个单链表相交的起始节点。思路:由于两个链表长度可能不同,所以应先使长链表走n步,这个n可以通过分别遍历链表后求差得到,消除链表长度差后遍历两个链表找相交的起始结点。图解:代码实现:(比较暴力)public class Solution { public ListNode getIntersectionNode(ListNode ...原创 2019-09-17 19:44:05 · 228 阅读 · 0 评论 -
链表回文结构
题目描述对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。给定一个链表的头指针head,请返回一个bool值,代表其是否为回文结构。思路:由于是单链表,结点没有指向前一个结点的引用,因此需要将后半部分链表反转。 定义两个引用,一个在链表头从前向后走,另一个在链表尾从后向前走。 每走一步判断两个结点的值是否相同,直到两个引...原创 2019-09-17 17:07:06 · 260 阅读 · 0 评论 -
删除链表中重复的结点
题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5思路:这个题看似简单,但需要注意的点还是很多。我们可以新创建一个辅助头结点,避免单独讨论头结点。定义两个引用pre 和 cur,当 cur 和 cur.n...原创 2019-09-17 16:35:15 · 132 阅读 · 0 评论 -
判断链表是否有环、环入口
题目描述:1、给定一个链表,判断链表中是否有环。解法:快慢指针的思想,fast一次走两步,slow一次走一步,如果某一时刻fast与slow相遇,那么肯定有环。代码实现:public class Solution { public boolean hasCycle(ListNode head) { ListNode fast = head; ...原创 2019-09-17 00:28:24 · 194 阅读 · 0 评论 -
链表分割
题目描述编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前给定一个链表的头指针 ListNode*pHead,请返回重新排列后的链表的头指针。注意:分割以后保持原来的数据顺序不变。解法:遍历原链表,按照基准将结点放到两个新链表中。最后合并两个链表即可。图解:代码实现:public class Partition { ...原创 2019-09-16 23:16:35 · 179 阅读 · 0 评论 -
链表中倒数第K个结点
题目描述输入一个链表,输出该链表中倒数第k个结点。解法:重点在于检查传入的参数是否合法。思想:定义两个引用fast和slow,fast先走k-1步,然后fast和slow一块走,当fast.next为空时,slow指向的位置即为倒数第K个结点。图解:代码实现:public class Solution { public ListNode FindKt...原创 2019-09-16 19:38:17 · 138 阅读 · 0 评论 -
链表的中间结点
题目描述:给定一个带有头结点head的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。解法一:思想:遍历计算链表长度length,走length/2即为中间结点:代码实现:class Solution { public ListNode middleNode(ListNode head) { ListNode c...原创 2019-09-16 17:56:30 · 145 阅读 · 0 评论 -
反转链表
题目描述输入一个链表,反转链表后,输出新链表的表头。思路:反转链表,关键在于如何保存某一个结点的前驱和后继。 因此我们定义三个引用,cur指向当前结点,prev指向cur的前一个结点,curNext指向cur的后一个结点。 保持这种关系不变,直到curNext为空,此时cur所指向的结点,就是反转后链表的新头结点。图解:反转后的链表:代码实现:pub...原创 2019-09-16 17:18:40 · 143 阅读 · 0 评论 -
用两个栈实现队列
题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。思路:队列“先进先出”,而栈“先进后出”,那么只要把两次进栈、两次出栈看做整体,就是队列。图解:完整代码:public class Solution { Stack<Integer> stack1 = new Stack<Integer>(...原创 2019-09-13 10:19:20 · 149 阅读 · 0 评论 -
从尾到头打印链表
题目描述:输入一个链表,按链表从尾到头的顺序返回一个ArrayList。解法:思路一:递归法public class Solution { ArrayList list = new ArrayList(); public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {...原创 2019-09-12 18:16:57 · 124 阅读 · 0 评论 -
最小栈
题目描述:设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。push(x)-- 将元素 x 推入栈中。 pop()-- 删除栈顶的元素。 top()-- 获取栈顶元素。 getMin() -- 检索栈中的最小元素。思路:利用辅助栈,辅助栈第一次不管数据大小都要放入,从第二次开始只存比上一个存的元素小的值。出栈的时候,只有在数据栈栈顶元素和...原创 2019-09-19 00:26:41 · 238 阅读 · 0 评论