程序员代码面试指南
程序员代码面试指南-IT名企算法与数据结构题目最优解
蜗牛不爱海绵宝宝
做一个有趣的人(大家可以关注我的GitHub:https://github.com/snail-wj/offer_demo,这个上面覆盖了剑指offer的所有解析以及参考URL,希望对大家面试有帮助)
展开
-
17.在单链表中删除指定值的节点
【题目】给定一个链表的头节点head和一个整数num,请实现函数将值为num的节点全部删除【代码1】时间复杂度O(n),空间复杂度O(n)class Solution { public ListNode deleteNode(ListNode head, int val) { ListNode cur = head; Stack<ListNode> stack = new Stack<>(); while(cur !=原创 2020-05-28 00:06:39 · 501 阅读 · 0 评论 -
16.删除无序单链表中值重复出现的节点
【题目】给定一个无序单链表的头节点head,删除其中值重复出现的节点。【代码1】时间复杂度O(n),空间复杂度O(n在这里插入代码片)class Solution { public ListNode deleteDuplicates(ListNode head) { if(head == null || head.next == null){ return head; } ListNode pre = head;原创 2020-05-27 23:42:22 · 541 阅读 · 0 评论 -
15.复制含有随机指针的链表
【题目】给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任意节点或空节点。要求返回这个链表的深拷贝【代码1】时间复制度O(n),空间复制度O(n)class Solution { public Node copyRandomList(Node head) { Node cur = head; Map<Node, Node> map = new HashMap<Node, Node>(); whil原创 2020-05-14 00:30:09 · 152 阅读 · 0 评论 -
14.两个单链表相加
【题目】给定两个用链表表示的整数,每个节点包含一个数位。例如:链表1为9-> 3 -> 7,链表2为6 -> 3,最后生成的结果为1 -> 0 -> 0 -> 0。【代码1】时间复杂度O(n),空间复杂度O(n) public ListNode addTwoNumbers(ListNode l1, ListNode l2) { Stack<Integer> stack1 = new Stack<>();原创 2020-05-12 01:06:58 · 424 阅读 · 0 评论 -
13.将单向链表按某值化分为左边小,中间相等,右边大的形式
【题目】给定一个单向链表的头节点head,节点的值类型是整形,在给定一个整数pivot。实现一个调整链表的函数,将链表调整为左部分都是值小于pivot的节点,中间部分都是值等于pivot的节点,右部分都是值大于pivot的节点。除这个要求外,对调整后的节点顺序没有更多的要求。【代码1】时间复杂度为O(n),空间复杂度为O(n) public Node listPartition(Node head, int pivot) { if (head == null) {原创 2020-05-09 02:23:28 · 318 阅读 · 0 评论 -
12.生成窗口最大值数组
【题目】给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。【代码】 public int[] maxSlidingWindow(int[] nums, int k) { if(nums == null || k < 1 || nums.length < k){ return new int[0]; ...原创 2020-05-07 00:07:54 · 202 阅读 · 0 评论 -
11.用一个栈实现另一个栈的排序
【题目】一个栈中的元素的类型为整形,现在想将该栈从顶到底按从小到大的顺序排序,只许申请一个栈。除此之外,可以申请新的变量,但是不能申请额外的数据结构,如何完成排序。【代码】 private void sortStackByStack(Stack<Integer> stack) { Stack<Integer> helper = new Stack...原创 2020-05-05 19:14:57 · 272 阅读 · 0 评论 -
10.如何仅用递归函数和栈操作逆序一个栈
题目 一个栈依次压入1,2,3,4,5,那么从栈顶到栈底分别为5,4,3,2,1。将这个栈转置后,从栈顶到栈底为1,2,3,4,5,也就是实现了栈中元素的逆序,但是只能用递归函数来实现,不能用其他数据结构代码 private int getAndRemoveLastElement(Stack<Integer> stack) { int result = ...原创 2020-05-05 16:58:26 · 202 阅读 · 0 评论 -
09.用两个栈实现队列
题目 用两个栈实现一个队列,队列的声明如下,请实现它的两个函数appendTail 和deleteHead,分别完成在队列尾部插入整数和在队列头部删除整数的功能。 (若队列中没有元素,deleteHead返回-1)。代码class CQueue { private Stack<Integer> stackPush = new Stack<Integer...原创 2020-05-05 15:58:42 · 132 阅读 · 0 评论 -
08.设计一个有getMin功能的栈
1.题目 请设计一个栈,除了常规栈支持的pop与push函数以外, 还支持min函数,该函数返回栈元素中的最小值。执行push, pop,和min的时间复杂度必须为O(1)。2.代码class MinStack { private Stack<Integer> minStack = new Stack<Integer>(); privat...原创 2020-05-05 15:52:28 · 131 阅读 · 0 评论 -
07.判断一个链表是否为回文结构
【题目】 给定一个链表的头节点head,前判断该链表是否为回文结构 例如: 1 -> 2 -> 1,返回true 1 -> 2 -> 2 -> 1,返回true 1 -> 2 -> 3,返回false【代码1,空间复杂度n】 public boolean isPalindrome(ListNode head) { Li...原创 2020-04-25 17:06:03 · 221 阅读 · 0 评论 -
06.环形单链表的约瑟夫问题
【问题】 输入:一个环形单向链表的头节点head和报数的值m 返回 :最后生存下来的节点,且这个节点自己组成环形单链表,其他节点都删掉。【代码】 public ListNode josephusKill(ListNode head, int m) { if (head == null || head.next == head || m < 1) { ...原创 2020-04-24 01:05:50 · 192 阅读 · 0 评论 -
05.反转部分单向链表
[题目]反转从位置 m 到 n 的链表。请使用一趟扫描完成反转,说明1 ≤ m ≤ n ≤ 链表长度。输入: 1->2->3->4->5->NULL, m = 2, n = 4输出: 1->4->3->2->5->NULL【代码】public ListNode reverseBetween(ListNode head, int...原创 2020-04-23 00:33:00 · 173 阅读 · 0 评论 -
04.反转单向链表和双向链表
【题目】实现反转单向链表的函数【代码】 public ListNode reverseList(ListNode head) { ListNode pre = null; ListNode next = null; while(head != null){ next = head.next; ...原创 2020-04-22 01:11:29 · 190 阅读 · 0 评论 -
03.删除链表的中间节点
【题目】 给定一个链表的头节点head,实现删除链表的中间节点的函数【代码】 private ListNode removeMidNode(ListNode node) { if (node == null || node.next == null) { return node; } ListNode pre =...原创 2020-04-22 00:16:39 · 105 阅读 · 0 评论 -
02.在单链表和双链表中删除倒数第K个节点
【题目】 分别实现两个函数,一个可以删除单链表中倒数第k个节点,另一个可以删除双链表中倒数第k个节点【代码】/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; }...原创 2020-04-20 23:36:58 · 140 阅读 · 0 评论 -
01.打印两个链表的公共部分
【题目】给定两个有序链表的头指针head1 和 head2,打印两个链表的公共部分【代码】 public void printCompareNode(Node n1, Node n2) { while (n1 != null && n2 != null) { if (n1.value < n2.value) { ...原创 2020-04-18 18:52:06 · 166 阅读 · 0 评论