剑指Offer
漫漫算法路
iTensor
中科院某所渣硕,瞎研究自然语言处理方向。
展开
-
剑指Offer – 栈的压入、弹出序列
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列 1,2,3,4,5 是某栈的压入顺序,序列 4,5,3,2,1 是该压栈序列对应的一个弹出序列,但 4,3,5,1,2 就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)。解题思路1. 借助一个辅助栈,将第一个序列的元素挨个压入栈中; 2. 压入栈中的同时和第二个序列进行比较,若相同则弹出,反之继续压入; 3. 当与第二个序列比较完毕后,若栈空则第原创 2020-08-08 12:01:56 · 247 阅读 · 0 评论 -
剑指Offer – 包含min函数的栈
包含min函数的栈题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的 minminmin 函数(时间复杂度应为 O(1)O(1)O(1))。解题思路定义一个辅助栈,用来存储当前栈中最小的数。将数据压入栈中时,比较当前数据和辅助栈栈顶元素大小。若栈顶元素大,则把当前数据压入辅助栈中;反之,再次压入栈顶元素。例如入栈元素为:7 4 5 9 2 3 1 4辅助栈中元素为:7 4 4 4 2 2 1 1代码import java.util.Stack;原创 2020-08-02 20:56:35 · 168 阅读 · 0 评论 -
剑指Offer – 二叉树的镜像
题目描述操作给定的二叉树,将其变换为源二叉树的镜像。二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5解题思路交换当前结点的左右结点后,整个左右子树也是交换了的,见下图:代码// 递归public void Mirror(原创 2020-07-27 12:52:27 · 126 阅读 · 0 评论 -
剑指Offer – 树的子结构
题目描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)解题思路找到二叉树A中对应二叉树B的根节点相同的节点。递归的判断A和B的左子树和右子树是否相同。代码public class Solution { public boolean HasSubtree(TreeNode root1,TreeNode root2) { boolean res = false; // 若A、B皆为空树时,返回false if原创 2020-07-23 21:52:03 · 231 阅读 · 0 评论 -
剑指Offer – 链表中倒数第k个结点
题目描述输入一个链表,输出该链表中倒数第k个结点。解题思路方法一:倒数第 k 个结点,就是正数第 n-k+1 个。若设置一个快指针先行遍历到链表的最后,那么倒数第 k 个结点与最后一个结点的距离相差 n - (n-k+1) = k - 1所以,可以让快指针线性走 k-1 步,此时,设置一个慢指针与快指针同时前进;当快指针走到最后,慢指针刚好走 k-1 步,即倒数第 k 个结点。代码public class Solution { public ListNode FindKthToT原创 2020-07-21 21:04:13 · 165 阅读 · 0 评论 -
剑指Offer – 调整数组顺序使奇数位于偶数前面
题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。解题思路简单方法:首先找到第一个偶数,然后从下一个开始遍历数组。找到偶数后的第一个奇数,按照插入排序,从后往前依次覆盖。重复以上两步,直至遍历结束。方法一:利用插入排序的思想。找到第一个偶数的位置 p ,从下一个位置 p+1 开始遍历数组。例如 [1, 2, 3, 4, 5, 6, 7],p = 1 ,从下标 2原创 2020-07-17 23:10:02 · 185 阅读 · 0 评论 -
剑指Offer – 数值的整数次方
题目描述给定一个 double 类型的浮点数 base 和 int 类型的整数 exponent 。求 base 的 exponent 次方。解题思路首先考虑 base 和 exponent 的取值范围,如下图所示:时间复杂度 O(n) :使用 base 相乘 exponent 次求整数次方。时间复杂度 O(logn) :快速幂求解。代码public class Solution { public double Power(double base, int expon原创 2020-07-14 22:07:03 · 211 阅读 · 0 评论 -
剑指Offer – 二进制中1的个数
题目描述输入一个整数,输出该数二进制表示中 1 的个数。其中负数用补码表示。考察二进制和位运算。解题思路代码一:1. 判断整数二进制最右边一位是不是1,然后整体向右移一位,最前面补0,直至整个整数为0。 2. 例如整数10的二进制为0000 0000 0000 0000 0000 0000 0000 1010(Java的int类型占用4个字节,即32位)。只看后四位的话,右移一位变成0101,继续右移为0010、0001、0000,可见右移三次整数就变成0。若右移过程中最后一位为1,则记录下原创 2020-07-12 21:59:19 · 967 阅读 · 0 评论 -
剑指Offer – 跳台阶
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。解题思路和斐波那契数列类似。代码public class Solution { public int JumpFloor(int target) { if(target==1 || target==2) return target; return JumpFloor(target-1) + JumpFloor(tar原创 2020-07-08 22:49:41 · 141 阅读 · 0 评论 -
剑指Offer – 斐波那契数列
题目描述大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。解题思路无代码public class Solution { // 递归 public int Fibonacci(int n) { if (n == 0) return 0; if (n == 1) return 1; return Fibonacci(n - 1) + Fibonacci原创 2020-07-06 22:40:35 · 154 阅读 · 0 评论 -
剑指Offer – 旋转数组的最小数字
旋转数组的最小数字题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组 {3,4,5,1,2} 为 {1,2,3,4,5} 的一个旋转,该数组的最小值为 1。NOTE:给出的所有元素都大于 0,若数组大小为 0,请返回 0。解题思路旋转数组中有两个非递减排序的数组,可以使用二分查找,从中间开始比较首尾。若中间数大于等于头数,说明前面的数组仍是非减排序,将头数指针指向中间数,作为新的头数;反之,若中间数小于原创 2020-06-26 19:43:24 · 207 阅读 · 1 评论 -
剑指Offer – 合并两个排序的链表
题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。代码// 非递归public ListNode Merge(ListNode list1,ListNode list2) { if (list1 == null && list2 == null) return null; if (list1 == null) return list2; if (list2 == null)原创 2020-06-25 22:31:15 · 142 阅读 · 0 评论 -
剑指Offer – 用两个栈实现队列
题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。解题思路既然是实现队列,那么就要保证先进去的元素先出来。可以先讲元素都放入一个栈中,这样所有的元素都是倒序。将栈中元素都出栈,存入另外一个栈中,这样所有的元素顺序都变成正序了。不过要判断以下另一个栈是否为空,不为空的话,就不用放进去。代码import java.util.Stack;public class Solution { Stack<Integer> stack1 =原创 2020-06-24 22:16:29 · 128 阅读 · 0 评论 -
剑指Offer – 重建二叉树
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。解题思路前序遍历的第一位是根节点。中序遍历中,根节点左右两边分别是左子树和右子树。代码public class Solution { public TreeNode reConstructBinaryTree(int[] pre, int[] in)原创 2020-06-21 20:22:06 · 142 阅读 · 0 评论 -
剑指Offer - 从尾到头打印链表
题目描述输入一个链表,按链表从尾到头的顺序返回一个ArrayList。解题思路代码public class Solution { public ArrayList<Integer> printListFromTailToHead(ListNode listNode) { ArrayList<Integer> array = new ArrayList<Integer>(); if (listNode == null)原创 2020-06-19 21:36:29 · 165 阅读 · 0 评论 -
剑指Offer - 替换空格
题目描述请实现一个函数,将一个字符串中的每个空格替换成 “%20”。例如,当字符串为 We Are Happy. 则经过替换之后的字符串为 We%20Are%20Happy。解题思路首先遍历字符串,计算共有多少空格,然后扩充字符串的长度。设置两个指针,头指针指向原始字符串的结尾,尾指针指向扩充后的结尾,从后往前遍历。若头指针指向字符不是空格,把当前字符放到尾指针指向空间,同时两个指针前移一位;若头指针指向字符是空格,尾指针前移三次,同时插入 %20,头指针前移一位;遍历,直至条件结束。原创 2020-06-19 13:26:45 · 163 阅读 · 0 评论 -
剑指Offer - 二维数组中的查找
题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。解题思路既然给定了有顺序的数组,那么肯定不会是从头遍历了。可以从左下角考虑,比它小的肯定在其上面,比它大的肯定在其右边,问题解决了。代码public class Solution { ...原创 2019-09-09 14:29:25 · 122 阅读 · 0 评论