![](https://img-blog.csdnimg.cn/20191107181258884.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
剑指offer
程序员布隆
这个作者很懒,什么都没留下…
展开
-
剑指offer-第一个只出现一次的字符
题目描述在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).题目解析这道题使用双指针和集合.第一个指针指向第一次出现的字符, 第二个指针往后顺次遍历, 如果没有相同的, 则说明第一个指针为只出现一次的字符, 如果出现过, 那么记录在集合当中, 以便下一次可以做到时间优化(不需要再...原创 2020-01-21 16:58:30 · 219 阅读 · 0 评论 -
剑指offer-丑数
题目描述把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。题目分析分为两种方法: 第一种是迭代求解 (看能否由2,3,5除尽)第一种方法牛客的判题机好像有问题, 这个方法始终是过不了的, 不过是一种解法.// 判断一个数是否为丑数public b...原创 2019-11-21 15:08:15 · 131 阅读 · 0 评论 -
剑指offer-把数组排成最小的数
题目描述输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。题目分析对于每两个数, 有如下两种排列:AB和 BA.所以只要依次对每两个元素比较即可.代码import java.util.*;public class Solution { publi...原创 2019-11-16 16:10:49 · 94 阅读 · 0 评论 -
剑指offer-整数中1出现的次数
题目描述求1~N之间, 1总共出现了多少次.题目分析这个题一共有三种做法.暴力做法1 - 字符串遍历这个是最简单的方法, 没什么可说的.// 暴力求解法1// T: O(n^2) S: O(1)public int findNumberBruteForce1(int n) { int cnt = 0; for (int i = 1; i <= n; i++) ...原创 2019-11-16 14:11:49 · 103 阅读 · 0 评论 -
剑指offer-连续子数组的最大和
题目描述给一个数组,返回它的最大连续子序列的和.题目分析这道题可以利用动态规划来解决.令状态dp[i]表示以A[i]为结尾的连续序列的最大和.此时以A[i]结尾的序列有两种情况:只有一个元素, 即为A[i]有多个元素, 即从A[k] ~ A[i] (k < i)于是我们得到状态转移方程:dp[i]=max(A[i],dp[i−1]+A[i]),dp[0]=A[0]dp...原创 2019-11-12 15:13:13 · 222 阅读 · 0 评论 -
剑指offer-最小的K个数
题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。题目解析我这里使用的方法是快速排序的partition, partition函数能快速的找到数组中左边都比其小, 右边都比其大, 也就是第K个数的位置. 只需要对应起来即可.代码import java.util.*;public class Soluti...原创 2019-11-12 14:25:49 · 110 阅读 · 0 评论 -
剑指offer-数组中出现次数超过一半的数字
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。题目分析这道题一共有三种做法:排序 + 取中位数HashMap快排partition + 取中位数解法一: 排序+取中位数这个方法基于如下一个容易被证明的...原创 2019-11-12 13:50:50 · 150 阅读 · 0 评论 -
剑指offer-字符串的排列
题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。题目分析这道题实际上是求字符串的全排列的问题.字符串的全排列可以通过交换字符实现,对于每一次递归:如果长度满足, 且结果集中不包含此字符串, 则加入结果集.交换当前字符和后面的字符固定当前的字符(...原创 2019-11-12 09:33:03 · 119 阅读 · 0 评论 -
剑指offer-二叉搜索树与双向链表
题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。方法一: 使用递归第一种方法是用递归去操作. 每一次递归的核心思想:找到左子树的最右节点, 和右子树的最左节点, 与根节点进行连接.然后对左子树和右子树做相同操作即可. public TreeNode convertRecursive(TreeNode...原创 2019-11-12 00:24:28 · 120 阅读 · 0 评论 -
剑指offer-复杂链表的复制
题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)题目分析题意就是: 复制一个链表, 但链表中还有一个指针域指向链表中的其他节点.这里用两种方法来解决: `1) 暴力法 2) 哈希表代码方法一: 暴力解法暴...原创 2019-11-11 23:08:45 · 148 阅读 · 0 评论 -
剑指offer-二叉树中和为某一值的路径
题目描述输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)题目分析此题目就是一个简单的DFS的问题, 但是有几个坑:不能直接利用引用去构造二维数组, 这样在递归的时候里面的值会变.不能当root == null时进行判断, ...原创 2019-11-11 15:51:11 · 113 阅读 · 0 评论 -
剑指offer-二叉搜索树的后序遍历序列
题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。题目解析[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k1ONwyoH-1573450239625)(https://cuijiahua.com/wp-content/uploads/2017/12/basis...原创 2019-11-11 13:30:57 · 136 阅读 · 0 评论 -
剑指offer-从上往下打印二叉树
题目描述从上往下打印二叉树的每个节点, 同层节点从左至右打印.题目解析这道题是典型的BFS队列对二叉树进行层序遍历的问题.其实DFS也可以做到(传入对应层数), 用下标找到对应位置存储.但是就这道题题面来看, BFS队列的方式最合适不过了.代码public class Solution { public void bfs(TreeNode root, ArrayList<...原创 2019-11-07 16:35:58 · 97 阅读 · 0 评论 -
剑指offer-栈的压入弹出序列
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)题目分析这道题的算法过程如下:设入栈数组A, 出栈数组B对每一个数...原创 2019-11-07 16:00:56 · 97 阅读 · 0 评论 -
剑指offer-包含min函数的栈
题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。如上图, 每次入栈把当前最小值同时入辅助栈顶即可.入辅助栈时, 仅需要判断上一个栈顶元素(放入当前值前的全局最小)是否比当前值更小即可.代码import java.util.Stack;public class Solution { public Stack&l...原创 2019-11-07 15:02:11 · 100 阅读 · 0 评论 -
剑指offer-顺时针打印矩阵
题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字.例如,如果输入如下4 X 4矩阵: [ [1 2 3 4] [5 6 7 8] [9 10 11 12] [13 14 15 16]]则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.题目分析一开始拿到这道题的时候, 我是这么写的:错误代码import j...原创 2019-11-05 15:17:07 · 103 阅读 · 0 评论 -
剑指offer-树的子结构
题目描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)题目解析首先来看一下什么是树的子结构?来比较一下这两个问题:子树子结构可见, 子结构可以是树的任意一部分, 而子树不是. 子结构包含子树.所以要求是否为子结构, 必须先确定一个根节点, 再使用递归去判断.代码public class Solution { ...原创 2019-11-05 14:12:06 · 105 阅读 · 0 评论 -
剑指offer-合并两个排序的链表
题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。解题思路使用一个空表头, 遍历两个链表, 每次将较小的链表节点加到空表头后面即可.最后将剩余节点直接连接到末尾即可.代码public class Solution { public ListNode Merge(ListNode list1,ListNode list2) {...原创 2019-11-04 18:33:59 · 112 阅读 · 0 评论 -
剑指offer-反转链表
题目描述输入一个链表,反转链表后,输出新链表的表头。题目分析使用三个指针进行链表的反转(curPre, cur, curNext).算法过程:初始化curPre = null, cur = head, curNext = head.next;直到cur != null:向前移动三个指针.(要注意curNext移动的时候有可能当前就是Null, 要判断下, 不然会报NullPoin...原创 2019-11-04 17:25:53 · 104 阅读 · 0 评论 -
剑指offer-链表中倒数第k个节点
题目描述输入一个链表,输出该链表中倒数第k个结点。解题思路利用两个相隔为k的指针, 就能巧妙地取到倒数第K个节点链表.代码public class Solution { public ListNode FindKthToTail(ListNode head,int k) { // 思路: 用两个相隔为k的指针扫描, 右指针扫到尾就找到了 if (...原创 2019-11-04 17:19:46 · 93 阅读 · 0 评论 -
剑指offer-调整数组顺序使奇数位于偶数前面
题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序:使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。题目解析这道题的关键点是在分开奇偶数的同时, 还要保证数据的稳定性(即 相对位置不变)如果不用保证稳定性, 直接使用双指针法, 交换奇数和偶数即可, 但是要保证稳定性, 就需要使用队列来维护数据的相对位置. 本题...原创 2019-11-04 15:53:49 · 83 阅读 · 0 评论 -
剑指offer-数值的整数次方
题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。保证base和exponent不同时为0题目分析这是一个使用快速幂的问题.快速幂一般有两种解决方式.递归快速幂递归快速幂是理解起来最简单的一种二分快速幂的实现.例: 求 x的10次幂由此规律, 我们可以写出如下算法:若x为偶数, 计算 f(x / 2) ...原创 2019-11-03 21:43:23 · 97 阅读 · 0 评论 -
剑指offer-二进制中1的个数
题目描述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。题目分析这道题可以使用位运算的方式, 进行右移, 如果最低位为1, 那么结果+1.至于怎么判断最低位的二进制值, 只需**&1**即可. 1的二进制为000…001, 那么&运算后最低一位往上都没有影响.JAVA的运算符优先级. 这里按位与运算的优先级低于 比较符号. 所以不使用括号就会报错.负数...原创 2019-11-03 20:50:09 · 117 阅读 · 0 评论 -
剑指offer-矩形覆盖
题目描述我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?题目解析格子数为一列时, 摆法为1, 两列时摆法为2(竖着放与横着放).三列时, 为 一列时摆法1 + 两列时摆法2 = 3.因为三列的最后一列可以分成两种情况:竖着放, 只占一个列, 那么摆法和(3 - 1)列的摆法一样. (注意是摆法!)...原创 2019-11-03 20:21:36 · 125 阅读 · 0 评论 -
剑指offer-变态跳台阶
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。题目分析这道题和跳台阶唯一不同的点就是: 可以一次跳 1 ~ N级.那这个问题类比成上一个版本只能跳1-2级的跳台阶,可以想到: N个台阶的走法, 相当于 1个台阶的走法 + 2个台阶的走法 + 3个台阶的走法 + … + N-1个台阶的走法 + 1(N个台阶的走法, ...原创 2019-11-03 12:58:54 · 86 阅读 · 0 评论 -
剑指offer-跳台阶
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。题目分析首先, 我们想象一共有1个台阶, 我们可走的方式是1种.如果有2个台阶, 则可走方式为2种(一步一个台阶 或 一次两个台阶到头)如果有3个台阶, 可走方式为: 有2个台阶时的所有可走方式 + 有1个台阶时的所有可走方式.为什么?因为假...原创 2019-11-03 12:47:50 · 77 阅读 · 0 评论 -
剑指offer-旋转数字的最小数字 (二分查找)
题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。题目分析这道题显然是使用二分查找的问题, 但是这道题利用二分查找需要注意几个问题.算法流程:将数...原创 2019-10-29 20:03:05 · 127 阅读 · 0 评论 -
剑指offer-用两个栈实现队列
题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。题目分析我们都知道, 栈是一种先进后出的结构, 但是如果要实现队列的功能, 就需要有一个另外的辅助栈, 把一个栈倾倒, 这样原先的先进后出就变成了队列的序列.但是每次都进行倾倒, 则非常浪费时间, 所以我们只当栈2空时, 才进行倾倒, 否则直接取栈2的栈顶元素即可.而每次新加的元素都直接放入栈...原创 2019-10-27 17:44:39 · 133 阅读 · 0 评论 -
剑指offer-重建二叉树
剑指offer-重建二叉树题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。题目分析这道题是典型的二叉树重建问题, 解题思路大体上为:取出前序遍历的第一个节点(根节点)利用前序遍历取出来的根...原创 2019-10-27 17:04:30 · 116 阅读 · 0 评论