
剑指offer
从_你的全世界路过
Look up at the stars,not down at your feet。
展开
-
剑指offer--(1)连续子数组的最大和--Java描述
写在前面: 使用动态规划求解 F(i)=以array[I]为末尾元素的子数组的和的最大值。 公式:F(i)=max( F(i-1) + array[i] , array[i] ) 设res=所有子数组的和的最大值。res=max( res , F(i)) 例如: 数组为:【6,-3,-2,7,-15,1,2,2】 初始状态:i=0时 F(0)=6 r...原创 2018-02-14 23:08:42 · 181 阅读 · 0 评论 -
剑指offer--(13)不要加减乘除做加法--Java描述
写在前面: 首先这道问题,不允许使用加减乘除,那么我们首先想到的就应该是位运算以及移位运算。移位运算:(1)<<左移运算符,eg:num<<1相当于num*2(2)>>右移运算符,eg:num>>1相当于num/2(3)>>>无符号位右移运算符,eg:num>>>1,忽略符号位,空位都以0补齐位运算:(1)位原创 2018-02-24 15:29:07 · 176 阅读 · 0 评论 -
剑指offer--(14)数组中重复的数字--Java描述
写在前面: 这道题,我们首先要注意的就是数组numbers中的数字在0-n-1之间,我们就可以利用这个特点,建立一个辅助的数组hash,数组长度为n,也就是说: (1)hash数组的下标,就可以用来记录numbers的元素,0-n-1。 (2)hash数组的下标对应的值,就可以用来记录numbers的元素出现的次数。注意: 因为这道题,只要找出一个重复的元素就可以,不要求这...原创 2018-02-24 16:57:12 · 223 阅读 · 0 评论 -
剑指offer--(15)构建乘积数组--Java描述
写在前面: 这道题,我们首先要掌握乘积的规律(1)B[0] = A[1] * A[2] * A[3] * A[4] *....*A[n-1] ;(没有A[0])(2)B[1] = A[0] * A[2] * A[3] * A[4] *....*A[n-1] ;(没有A[1])(3)B[2] = A[0] * A[1] * A[3] * A[4] *....*A[n-1] ;(没有A[2]) ...原创 2018-02-24 18:21:53 · 179 阅读 · 0 评论 -
剑指offer--(16)对称的二叉树--Java描述
写在前面: 判断二叉树是否为对称的标准是:源二叉树是否等于二叉树的镜像 对称二叉树的特点是:(好绕嘴啊)(1)根节点的左子树等于右子树,或左子树右子树都为空(2)左子树的左子树等于右子树的左子树(3)左子树的右子树等于右子树的左子树如图所示:左边的是对称二叉树,而右边的不是。代码实现:boolean isSymmetrical(TreeNode root) { // 根节点的左子树...原创 2018-02-24 21:37:03 · 224 阅读 · 0 评论 -
剑指offer--(17)按之字形顺序打印二叉树--Java描述
写在前面: 首先,我们需要知道,按之字形顺序打印的规律,即: (1)第一行,也就是根节点,按从左至右打印-----奇数行 (2)第二行,也就是根节点的左子树,右子树,按从右至左打印-----偶数行依次类推,这样我们就找到了规律,我们定义一个int layer记录层数,定义两个栈 Stack1 记录奇数行的结点,Stack2 记录偶数行的结点。 代码实现: pu...原创 2018-02-24 23:00:51 · 300 阅读 · 0 评论 -
剑指offer--(18)删除链表中重复的结点--Java描述
写在前面: 删除链表中重复的结点,我们需要考虑两种重复的情况:(1)从head就开始重复 eg:{1,1,2,2,3}(2)正常重复 eg:{1,2,2,3,3,5}那么为了避免第一种情况出现,程序没有删除头结点,我们需要自己创建一个头结点: ListNode first = new ListNode(-1);// 新建一个头节点,避免,从head就开始重复此外,我们还要用一个start...原创 2018-02-25 11:40:51 · 200 阅读 · 0 评论 -
剑指offer--(19)二叉树的下一个结点--Java描述
写在前面: 这道问题,由于是中序遍历,我们需要考虑以下几种情况: (1)root=null,那么直接返回null (2)如果node有右子树,那么就从node的右子树开始寻找,一直找到node的右子树的最左结点,即为node中序遍历的下一个结点。 (3)如果node没有右子树,那么就找node的父结点的left,是否等于node,如果等于node,就返回这个父亲结点,不等于...原创 2018-02-25 13:23:56 · 185 阅读 · 0 评论 -
剑指offer--(20)序列化二叉树--Java描述
写在前面: 二叉树的序列化:在前序遍历的基础上,将二叉树的结点遍历成一个字符串 二叉树的反序列化:在前序遍历的基础上,将一个字符串还原成一颗二叉树注意:(1)空指针null,序列化成一个特殊字符"#"(2)相邻结点间的值,用","相隔,这样在反序列化时,就可以通过","来分割出一个数组(3)定义一个index,初始化为-1,在反序列化时,记录数组的索引。代码实现: public cla...原创 2018-02-25 15:46:16 · 174 阅读 · 0 评论 -
剑指offer--(12)孩子们的游戏(圆圈中最后剩下的数)--Java描述
写在前面: 首先,当我们看到题目,孩子们围成一个圆圈的时候,我们首先可以想到循环链表,用一个链表来模拟孩子们的位置,定义一个location来记录被删除节点的位置,从list中删除索引为location的元素,最后list中剩下的元素,就是获奖的索引。注意: (1)while循环的条件是:list.size()>1 (2)location的值要不断累加,因为每次报数是从上一...原创 2018-02-24 12:19:21 · 236 阅读 · 0 评论 -
剑指offer--(11)左旋转字符串--Java描述
写在前面: 这道问题与上一篇博客类似,大家可以先参考一下(http://blog.youkuaiyun.com/may_3/article/details/79358590),那么这道问题的解题思路是,将整个字符串分为两部分: 第一部分:前k个字符(也就是要左移的字符串),第二部分:后面的所有字符。代码实现: public String LeftRotateString(String str,...原创 2018-02-24 11:40:05 · 232 阅读 · 0 评论 -
剑指offer--(2)跳台阶--Java描述
写在前面: 题目:一只青蛙一次可以跳上1级台阶,也可以一次跳上2级台阶,求青蛙跳上n级台阶有多少种跳法首先:这个问题我们需要理解一个思路就是,当青蛙跳上第n级台阶的时候,他有可以有2种方式 第一种:从n-1阶跳1步,到第n级。 第二种:从n-2级跳2步,到第n级。所以说当我们知道 从0到n-1阶的跳法+从0到n-2阶的跳法之后,我们就知道了从0到第n阶的跳法总数。我们可以总结出公...原创 2018-02-17 12:24:35 · 223 阅读 · 0 评论 -
剑指offer--(3)树的子结构--Java描述
写在前面: 这个问题的关键在于,从root1开始寻找,第一个相同的根节点,找到之后调用自定义的函数,来遍历,判断是否是子结构。Java代码实现如下:public class Solution { public boolean HasSubtree(TreeNode root1,TreeNode root2) { boolean flag=false; ...原创 2018-02-21 11:27:35 · 184 阅读 · 0 评论 -
剑指offer--(4)把数组排成最小的数--Java描述
写在前面: 这到问题,本身解决起来,比较容易,但是由这道题,我们可以重温一下java基础中,Comparator接口,Arrays类以及String类的一些方法。 我们先来看一下代码实现:import java.util.ArrayList;import java.util.Arrays;import java.util.Comparator;public class Solut...原创 2018-02-23 17:50:24 · 192 阅读 · 0 评论 -
剑指offer--(5)数字在排序数组中出现的次数--Java描述
写在前面: 首先,这道问题,当我们看到"排序数组"这四个字的时候,我们首先想到的应该是使用二分法,但是传统的二分法,只能让我们找到一个索引,当数组中出现多个相同元素的时候,返回的索引不确定。eg:int [] str=new int [] {3,3,3}; 而我们,为了找到数字出现的次数,就要找到这个数字第一个出现的索引firstKey和最后一次出现的索引lastKey,最后的结果=last...原创 2018-02-23 17:56:45 · 156 阅读 · 0 评论 -
剑指offer--(6)平衡二叉树--Java描述
写在前面: 平衡二叉树(AVL树)首先是一个二叉搜索树,他的特点是:(1)平衡二叉树可以是一颗空树或左右子树的高度差的绝对值(2)他的左子树和右子树也都是平衡二叉树代码实现:boolean isBalanced = true; public boolean IsBalanced_Solution(TreeNode root) { if (root == null) { re...原创 2018-02-23 19:48:10 · 253 阅读 · 0 评论 -
剑指offer--(7)和为S的连续整数序列--Java描述
写在前面: 这个问题的基本思路是,定义两个指针,指针small指向序列的最小值,big指向序列的最大值。设置一个初始值current=small+big。 (1)当current<sum的时候,我们要增加big的值。 (2)当current>sum的时候,我们要增加small的值。注意:最外层循环while的条件是small值的大小,由于至少为两个值,所以small&...原创 2018-02-23 21:50:51 · 296 阅读 · 0 评论 -
剑指offer--(8)和为S的两个数字--Java描述
写在前面: 有了上一篇文章的基础(链接:http://blog.youkuaiyun.com/may_3/article/details/79357223),我们再来看这道题目就会简单很多。同样是要设置两个指针start记录两个数中较小数的索引,和end记录两个数中较大数的索引。 (1)array[start]+array[end]==sum时,保存到list中。 (2)array[s...原创 2018-02-23 22:34:01 · 218 阅读 · 0 评论 -
剑指offer--(9)扑克牌顺子--Java描述
写在前面: 注意:题目规定了,大小王看作是0.题目的关键点在于:(1)记录手中扑克牌大小王(也就是0)的数量(2)记录手中扑克牌中,相邻两张牌的间隔,如果间隔>大小王的数量,则直接return false.(3)记录手中扑克牌是否有对(即是否有相同的牌),如果有对,则直接return false.代码实现:package test7;import java.util.Arrays;...原创 2018-02-23 23:00:29 · 216 阅读 · 0 评论 -
剑指offer--(10)翻转单词顺序列--Java描述
写在前面: 题目的要求为:将输入字符串为"I am a Student.",转换输出为"Student. a am I". 那么这道题的思路是: (1)翻转整个字符串,得到".tneduts a ma I" (2)翻转每一个单词,得到“student. a am I"接下来,我们看一下他的代码实现: public String ReverseSentence(String...原创 2018-02-24 11:02:34 · 449 阅读 · 0 评论 -
剑指offer--(21)链表中环的入口结点--Java描述
写在前面: 剑指offer中,面试中,都很经典的一个问题,今天进行总结,其实从这个题目中,可以解析,延伸出多个问题,如:链表中是否存在有环,如果有环,求链表中环的入口结点,环的长度是多少等。 题目链接:https://www.nowcoder.com/questionTerminal/253d2c59ec3e4bc68da16833f79a38e4 (1)链表中是否存在有环 ...原创 2018-04-19 13:12:55 · 258 阅读 · 0 评论