
剑指Offer
徐明曉
这个作者很懒,什么都没留下…
展开
-
算法(上)
算法文章目录算法1. 数组1. 剑指Offer:数组旋转2. 剑指Offer:调整数组顺序使奇数位于偶数前面3. 剑指Offer: 顺时针打印矩阵4. 剑指Offer: 数组中出现次数超过一半的数字5. 剑指Offer:丑数6. 剑指Offer: 数组中的逆序对7. 剑指Offer: 扑克牌顺子8. 剑指Offer: 数组中重复的数字9. 剑指Offer: 构建乘积数组10. 剑指Offer: 数据流中的中位数11. 剑指Offer: 矩阵中的路径2. 链表1. 剑指Offer:从尾到头打印链表2. 剑指原创 2020-07-18 16:12:18 · 1323 阅读 · 0 评论 -
剑指Offer:二维数组中的查找
1. 题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。原题传送门:link.2. 提取关键词二维数组;行列递增;整数3. 思路利用行列递增条件检索从左上角来看,向下递增,向右递增,无法快速检索,排除此方法从右上角来看,向下递增,向...原创 2020-03-22 09:16:37 · 134 阅读 · 0 评论 -
剑指Offer:替换空格
1. 题目描述请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。原题传送门:link.2. 提取关键词字符串3. 思路创建一个新的字符串从前往后遍历原字符串遇到字母添加原字母遇到空格添加“%20”最后输出新字符串4. 代码实现(Java)public class ...原创 2020-03-22 09:52:03 · 88 阅读 · 0 评论 -
剑指Offer: 从尾到头打印链表
1. 题目描述请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。原题传送门:link.2. 提取关键词字符串3. 思路首先使用头插法逆置链表然后将链表导入到数组里4. 代码实现(Java)/*** public class ListNode {* ...原创 2020-03-22 10:10:37 · 96 阅读 · 0 评论 -
剑指Offer: 重建二叉树
1. 题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。原题传送门:link.2. 提取关键词重建二叉树,前序遍历,后序遍历3. 思路暂无4. 代码实现(Java)/** * Defi...原创 2020-03-22 10:15:13 · 104 阅读 · 0 评论 -
剑指Offer: 用两个栈实现队列
1. 题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。原题传送门:link.2. 提取关键词栈,队列3. 思路暂无4. 代码实现(Java)/** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left;...原创 2020-03-22 10:33:57 · 107 阅读 · 0 评论 -
剑指Offer: 旋转数组的最小数字
1. 题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。原题传送门:link.2. 提取关键词数组的旋转,非递减排序3. 思路利用二分查找的思路...原创 2020-03-22 10:50:32 · 88 阅读 · 0 评论 -
剑指Offer: 斐波那契数列
1. 题目描述大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n<=39原题传送门:link.2. 提取关键词斐波那契数列3. 思路递归递归一定有一个结束条件,不然会无限调用自己:if(n= =0) return 0;if(n= =1 || n= =2) return 1;递归一定有一个功能,我们只考虑...原创 2020-03-22 11:01:08 · 82 阅读 · 0 评论 -
剑指Offer: 跳台阶
1. 题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。原题传送门:link.2. 提取关键词青蛙,斐波那契数列3. 思路斐波那契数列、递归递归一定有一个结束条件,不然会无限调用自己:if(target= =1) return 1;if(target= =2) return 2;递归一定有...原创 2020-03-22 11:09:19 · 96 阅读 · 0 评论 -
剑指Offer: 变态跳台阶
1. 题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。原题传送门:link.2. 提取关键词斐波那契数列,青蛙3. 思路根据经验,青蛙不可能跳上n(n->∞)级台阶,此题不成立! =。=4. 代码实现(Java)ublic class Solution { public int JumpFloo...原创 2020-03-22 11:16:13 · 148 阅读 · 0 评论 -
剑指Offer: 二进制中1的个数
1. 题目描述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。原题传送门:link.2. 提取关键词二进制,负数,补码3. 思路链接: link.4. 代码实现(Java)ublic class Solution { public int JumpFloorII(int target) { int count = 0; whi...原创 2020-03-22 17:50:14 · 89 阅读 · 0 评论 -
剑指Offer:数值的整数次方
1. 题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。保证base和exponent不同时为0原题传送门:link.2. 提取关键词浮点数,负数,补码3. 思路1.全面考察指数的正负、底数是否为零等情况。2.写出指数的二进制表达,例如13表达为二进制1101。3.通过&1和>>1来逐位读取1...原创 2020-03-22 18:45:39 · 87 阅读 · 0 评论 -
剑指Offer:调整数组顺序使奇数位于偶数前面
1. 题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。保证base和exponent不同时为0原题传送门:link.2. 提取关键词奇数,偶数,相对位置不变3. 思路参考快速排序i++往前走碰到偶数停下来,j = i+1若 a[j]为偶数,j++前...原创 2020-03-22 18:58:50 · 121 阅读 · 0 评论 -
剑指Offer: 链表中倒数第k个结点
1. 题目描述输入一个链表,输出该链表中倒数第k个结点。原题传送门:link.2. 提取关键词链表,倒数第k个3. 思路链表长度无法直接输出,可遍历得出本题使用快慢指针,使快指针与慢指针间始终相差k个节点当快指针到达尾部后的null时,慢指针刚好在倒数第k个节点要考虑数组长度小于k的情况,此时返回null4. 代码实现(Java)/*public class ListN...原创 2020-03-22 19:44:01 · 112 阅读 · 0 评论 -
剑指Offer: 反转链表
1. 题目描述输入一个链表,反转链表后,输出新链表的表头。原题传送门:link.2. 提取关键词反转链表3. 思路头插法返回头节点应该为newhead.nextnewhead应该被定义为链表递归方法也可4. 代码实现(Java)/*public class ListNode { int val; ListNode next = null; Li...原创 2020-03-22 19:57:40 · 96 阅读 · 0 评论 -
剑指Offer: 合并两个排序的链表
1. 题目描述输入一个链表,反转链表后,输出新链表的表头。原题传送门:link.2. 提取关键词反转链表3. 思路非递归递归传送门:link.4. 代码实现(Java)/*/*public class ListNode { int val; ListNode next = null; ListNode(int val) { ...原创 2020-03-22 20:37:08 · 93 阅读 · 0 评论 -
剑指Offer: 树的子结构
1. 题目描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)原题传送门:link.2. 提取关键词树的子结构3. 思路首先设置标志位result = false,因为一旦匹配成功result就设为true,剩下的代码不会执行,如果匹配不成功,默认返回false递归思想,如果根节点相同则递归调用DoesTree1HaveTree2(),...原创 2020-03-22 20:42:58 · 172 阅读 · 0 评论 -
剑指Offer: 二叉树的镜像
1. 题目描述操作给定的二叉树,将其变换为源二叉树的镜像。输入描述:二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5原题...原创 2020-03-22 21:10:01 · 106 阅读 · 0 评论 -
剑指Offer: 顺时针打印矩阵
1. 题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.原题传送门:link.2. 提取关键词矩阵3. 思路暂无4. 代码实现(Java)import ...原创 2020-03-22 21:38:29 · 83 阅读 · 0 评论 -
剑指Offer: 包含min函数的栈
1. 题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。注意:保证测试中不会当栈为空的时候,对栈调用pop()或者min()或者top()方法原题传送门:link.2. 提取关键词栈3. 思路暂无4. 代码实现(Java)import java.util.Stack; public class Solution {...原创 2020-03-22 21:50:14 · 105 阅读 · 0 评论 -
剑指Offer:栈的压入、弹出序列
1. 题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)原题传送门:link.2. 提取关键词栈3. 思路用一个栈来模拟压入弹...原创 2020-03-23 16:00:15 · 129 阅读 · 0 评论 -
剑指Offer: 从上往下打印二叉树
1. 题目描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。原题传送门:link.2. 提取关键词二叉树遍历3. 思路使用队列来进行层次遍历4. 代码实现(Java)import java.util.ArrayList;/**public class TreeNode { int val = 0; TreeNode left = null; ...原创 2020-03-23 16:07:57 · 134 阅读 · 0 评论 -
剑指Offer: 二叉搜索树的后序遍历
1. 题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。原题传送门:link.2. 提取关键词二叉搜索树的后序遍历3. 思路使用递归的方法设置递归结束条件:if(end <= start) return true;设置递归功能:for (; i < en...原创 2020-03-23 16:34:30 · 117 阅读 · 0 评论 -
剑指Offer: 二叉树中和为某一值的路径
1. 题目描述输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)原题传送门:link.2. 提取关键词二叉树3. 思路使用递归的方法设置递归结束条件:if(root == null) return listAll;设置...原创 2020-03-23 17:00:40 · 94 阅读 · 0 评论 -
剑指Offer: 复杂链表的复制
1. 题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)原题传送门:link.2. 提取关键词复杂链表的复制3. 思路在每一个结点后面插入复制的结点对复制结点的random的链接进行赋值拆分出复制的链表4....原创 2020-03-23 17:04:53 · 84 阅读 · 0 评论 -
剑指Offer: 二叉搜索树与双向链表
1. 题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向原题传送门:link.2. 提取关键词复杂链表的复制3. 思路在每一个结点后面插入复制的结点对复制结点的random的链接进行赋值拆分出复制的链表4. 代码(Java)/*public class RandomListNode { int ...原创 2020-03-23 18:01:56 · 124 阅读 · 0 评论 -
剑指Offer: 字符串的排列
1. 题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。原题传送门:link.2. 提取关键词打印字符串3. 思路二叉树的递归遍历牛客网解答链接: link.4...原创 2020-03-23 18:08:29 · 103 阅读 · 0 评论 -
剑指Offer: 数组中出现次数超过一半的数字
1. 题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。原题传送门:link.2. 提取关键词打印字符串3. 思路如果有符合条件的数字,则它出现的次数比其他所有数字出现的次数和还要多。在遍历数组时保存两个值:一...原创 2020-03-23 18:35:43 · 95 阅读 · 0 评论 -
剑指Offer:最小的K的个数
1. 题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。原题传送门:link.2. 提取关键词最小3. 思路暂无4. 代码(Java)import java.util.ArrayList;public class Solution { public ArrayList<Integer...原创 2020-03-23 18:41:08 · 125 阅读 · 0 评论 -
剑指Offer:最小k的个数
1. 题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。原题传送门:link.2. 提取关键词最小3. 思路暂无4. 代码(Java)import java.util.ArrayList;public class Solution { public ArrayList<Integer...原创 2020-03-28 15:47:11 · 132 阅读 · 0 评论 -
剑指Offer:连续子数组的最大和
1. 题目描述{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和。原题传送门:link.2. 提取关键词动态规划3. 思路慢慢从1开始扩张数组,记录数组子序列的最大值。4. 代码(Java)public class Solution { public int FindGreatestS...原创 2020-03-28 16:13:56 · 112 阅读 · 1 评论 -
剑指Offer:整数中1出现的次数(从1到n整数中1出现的次数)
1. 题目描述求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。原题传送门:link.2. 提取关键词字符串3. 思路用了比较"蠢"的办法s.append( )方法: 创建了一个新的数组,扩大了长度,将需要添加的字符串给复制到这个新的数组中4. 代码(Java)public class Solution { public int NumberOf1B...原创 2020-03-28 16:26:17 · 144 阅读 · 0 评论 -
剑指Offer:把数组排成最小的数
1. 题目描述输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323原题传送门:link.2. 提取关键词字符串3. 思路自定义一个比较大小的函数,比较两个字符串s1, s2大小的时候,先将它们拼接起来,比较s1+s2,和s2+s1那个小,由于求能排成的最小数字...原创 2020-03-28 16:42:05 · 220 阅读 · 0 评论 -
剑指Offer:丑数
1. 题目描述输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323原题传送门:link.2. 提取关键词丑数3. 思路https://www.nowcoder.com/profile/835689/codeBookDetail?submissionId=15226...原创 2020-03-28 20:51:28 · 91 阅读 · 0 评论 -
剑指Offer: 第一个只出现一次的字符
1. 题目描述在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).原题传送门:link.2. 提取关键词哈希数组3. 思路建立一个key为字符,val为次数(整数类型)的哈希map;遍历字符串,将字符和次数插入到哈希map中;规则为:定义time就是字符出现的次数,每出现...原创 2020-03-28 21:32:01 · 103 阅读 · 1 评论 -
剑指Offer: 数组中的逆序对
暂时不做,搁置https://www.nowcoder.com/practice/96bd6684e04a44eb80e6a68efc0ec6c5?tpId=13&tqId=11188&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking原创 2020-03-28 21:42:06 · 91 阅读 · 0 评论 -
剑指Offer: 两个链表的第一个公共结点
1. 题目描述输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)原题传送门:link.2. 提取关键词哈希数组3. 思路首先将两个指针全部遍历到链表的尾部然后长链表的长度len1减去短链表len2的长度得len1-len2然后设置短链表指针指针从头出发,长链表指针从len1-len2处出发第一个交点...原创 2020-03-28 22:13:05 · 118 阅读 · 0 评论 -
剑指Offer: 数字在排序数组中出现的次数
1. 题目描述统计一个数字在排序数组中出现的次数。原题传送门:link.2. 提取关键词折半查找3. 思路看到排序,想到折半查找;由于是有序的,相同的数字一定是靠着,找到后左右寻找有几个相同的值。4. 代码(Java)//排序数组,是关键,这是升序还是降序?默认升序吧,如果不是要加判断的public class Solution { public int GetNu...原创 2020-03-28 23:10:30 · 157 阅读 · 0 评论 -
剑指Offer: 二叉树的深度
1. 题目描述输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。原题传送门:link.2. 提取关键词二叉树深度3. 思路见注释4. 代码(Java)/**public class TreeNode { int val = 0; TreeNode left = null; TreeN...原创 2020-03-28 23:24:58 · 169 阅读 · 0 评论 -
剑指Offer: 平衡二叉树
1. 题目描述输入一棵二叉树,判断该二叉树是否是平衡二叉树。原题传送门:link.2. 提取关键词二叉树深度3. 思路从下往上遍历,如果子树是平衡二叉树,则返回子树的高度;如果发现子树不是平衡二叉树,则直接停止遍历4. 代码(Java)public class Solution { public boolean IsBalanced_Solution(TreeNode ...原创 2020-03-29 12:01:35 · 115 阅读 · 0 评论