- 博客(25)
- 收藏
- 关注
原创 二叉树中和为某一值的路径 (剑指Offer 第 23 题)
题目描述:输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。解题思路:遍历二叉树的时候,对节点进行求和,判断其与目标值的大小,进而进行下一步操作。 1. 若求和大于等于目标值,但是还没有到叶子节点,则放弃这条路径。 2. 若求和小于目标值,而且还没有到叶子节点,继续往下遍历。若已经到了叶子节点,则放弃这条路
2017-11-19 12:05:32
409
原创 二叉搜索树的后序遍历序列 (剑指Offer 第 22 题)
题目描述:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。解题思路:首先要知道二叉搜索树的定义:其在二叉树的基础上,多了一个限制条件,所有的左子树都必须比父节点小,所有的右子树都必须比父节点大。 后序遍历的规律:如上图,根节点在最后一位,前面是左子树,后面是右子树。其中左子树的值均小于最后一位,右子树的值均大
2017-11-19 10:41:08
323
原创 从上往下打印二叉树 (剑指Offer 第 21 题)
题目描述:从上往下打印出二叉树的每个节点,同层节点从左至右打印。解题思路:题目实际上就是二叉树的层序遍历,如上图,我们借助队列来存储节点来实现层序遍历的效果,具体操作: 1. 先将根节点入队列 2. 将根节点出队列,打印;然后将其左右子树依次入队列(若其存在) 3. 重复步骤2,直到将树遍历完为止。上面步骤最核心的就是步骤2,步骤2为什么能够实现层序的效果呢?当该节点出栈的时候,才会将下一层的
2017-11-18 16:17:32
1128
原创 栈的压入、弹出序列 (剑指Offer 第 20 题)
题目描述:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)解题思路:这道题,主要思想是,由弹出序列来检验输入操作,若输入操作完毕后,仍然没有匹配到弹出序
2017-11-18 14:20:23
272
原创 包含min函数的栈 (剑指Offer 第 19 题)
题目描述:定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。解题思路:这道题主要还是实现栈的功能,至于min函数可以将栈元素全部弹出进行比较即可!由于Java自身带有Stack类,可直接使用,这里,自定义实现栈的功能(利用链表实现)。Java代码实现:public class MyStack { pr
2017-11-17 21:45:40
211
原创 二叉树的镜像 (剑指Offer 第 17 题)
题目描述:操作给定的二叉树,将其变换为源二叉树的镜像。解题思路:递归遍历每一个节点,将每一个节点的左右子节点互换,那么,树就会从叶子节点向上到根一层一层的互换成镜面效果。Java代码实现:public TreeNode mirror(TreeNode root){ if (root == null){ return null;//递归出口 }
2017-11-17 11:22:59
360
原创 树的子结构 (剑指Offer 第 16 题)
题目描述:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)解题思路:从A树根开始往下遍历,遍历到的每一个节点,都看做是一个新的根,然后与B比较是否相同。以上主要分为2块: A树的遍历 + A子树与B树比较是否相同。对于第一块可以采用递归来遍历,对于第二块也采用递归来逐个对应遍历比较。Java代码实现:public class Solution {
2017-11-17 10:45:15
229
原创 合并两个排序的链表(剑指Offer 第 15 题)
题目描述:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。解题思路: 主要就是使用递归的方法,将筛选出来的ListNode一节一节的连接上。直接看代码实现。Java代码实现:public ListNode Merge(ListNode list1, ListNode list2){ if (list1==null&&list2==null
2017-11-16 09:40:44
174
原创 链表中倒数第k个节点(剑指Offer 第14 题)
题目描述:输入一个链表,输出该链表中倒数第k个结点。解题思路:主要介绍两种方法:1. 链表逆序+前第k个节点(容易想到的) 2. 快慢指针 1 . 链表逆序 + 前第k个节点这里面难度主要就是前面的链表逆序,先介绍它! 如上图,我们在遍历链表的同时,将链表进行逆序!主要分为以下几步:public ListNode converseList(ListNode head){
2017-10-13 23:48:37
244
原创 调整数组顺序使奇数位于偶数前面(剑指Offer 第 13 题)
题目描述:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。解题思路:上图中,已经将思路分为几步曾现出来了! 第一步,先遍历数组,找到奇数(偶数不用管,只要奇数都放在前面了,偶数自然都排到后面了),将该奇数保存到temp变量中!设置index位,初始指向数组第一位,当有奇数放入
2017-10-12 23:57:22
268
原创 数值的整数次方(剑指Offer 第 12 题)
题目描述:给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。解题思路:这道题主要就是一个容易忽视的点,就是指数可能是负数,所以要分类讨论一下! 指数运算,那就是同一个数循环相乘指数次就行了!Java代码实现:public class Solution { public double Power(double base, int
2017-10-12 23:18:11
215
原创 二进制中1的个数(剑指Offer 第 11 题)
题目描述:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。解题思路主要介绍3种方法:Java API 辗转相除法&运算1 . Java APIInteger.toBinaryString(10);//得到10的二进制表示的字符串表示//判1的个数,可以遍历判断,也可以subString(x,x+1)来判断第x位的。//遍历判断
2017-10-11 20:26:42
348
原创 矩形覆盖 (剑指Offer 第 10 题)
题目描述:我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?解题思路:如上图,一次覆盖有两种方法,方法1或方法2,方法1或2占用长度n分别为1或2,那么,剩下的长度为n-1或n-2,抽象一下:就是长度n,每次可以取1或2,有多少种取法? 这样是不是就是青蛙跳台阶的问题,一样一样的! 代码也是差不多的类似的:Java代
2017-10-11 10:52:36
276
原创 变态跳台阶(剑指Offer 第 9 题)
题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。解题思路:网上出现比较多的方法都是不完全归纳法,找出规律有总共有 2的n-1次方 跳法。参见: http://blog.csdn.net/ns_code/article/details/25367797这里提出一种不一样的思路:如上图,每一种跳法都是从1到n的一条路径,我们监
2017-10-10 23:58:29
366
原创 跳台阶(剑指Offer 第 8 题)
题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。解题思路:青蛙跳一次,有2种情况!跳1级,或跳2级,那么剩下n-1级或n-2级,那木,这道题的思想就是监听每次跳的情况,就是每次有几种(题中给出2种)跳法,跳完之后剩下的台阶跳一步,有几种跳法,一直递归,到满足递归出口条件位置,在往外递归层层累加就得到答案。 代码和Fibonacci类似:Java代
2017-10-10 21:30:34
288
原创 斐波那契数列(剑指Offer 第 7 题)
题目描述:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。 n<=39解题思路:这道题是一个简单典型的递归思想考察,首先,Fibonacci数列 1,1,2,3,5,8,…… 前两个数是1,后面每一个数都是前2个数的和。 直接上代码吧:Java代码实现:public class Solution { public int Fibonacci(int n) {
2017-10-10 20:17:23
312
原创 旋转数组的最小数字(剑指Offer 第 6 题)
题目描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。解题思路:这道题主要是一个规律问题,34512找最小值,原来12345是非递减的(递增+可能存在相同的元素),旋转
2017-10-10 19:42:33
275
原创 用两个栈实现队列 (剑指Offer 第 5 题)
题目描述: 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。解题思路: 两个 先进后出 实现一个 先进先出 的功能! 整个流程如上图所示:队列的push操作就是stack1的push操作;队列的pop操作,先要判断stack2中是否为空,若为空,将stack1中的所有元素都倒进来(必须所有,保证了顺序),然后在执行stack2的pop操作弹出即可,若不为空,
2017-10-10 17:15:58
222
原创 重建二叉树 (剑指Offer 第 4 题)
题目描述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。链接: http://blog.csdn.net/fran_lee/article/details/78028589之前总结过一篇前序中序后序互推
2017-10-10 12:32:43
309
原创 从尾到头打印链表 (剑指Offer 第 3 题)
题目描述: 输入一个链表,从尾到头打印链表每个节点的值。解题思路: 此题是一个典型的递归思想考察,这里我就用递归实现。思路:从链表头到尾依次往里递归,在尾部将节点值添加到ArrayList中,然后逐层往外(从尾到头)递归将节点依次添加到ArrayList中。Java代码实现:import java.util.ArrayList;public class Solution { publi
2017-10-09 14:58:55
359
原创 替换空格 (剑指Offer 第 2 题)
题目描述: 请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。解题思路: 题目提示使用StringBuffer,的确使用StringBuffer比String要省事的多!StringBuffer相对于String主要用于对于字符串的变化(追加/插入/删除)等操作。此题,先拿到空格对应的第一个索
2017-10-09 12:53:55
337
原创 二维数组中的查找 (剑指Offer 第 1 题)
题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。解题思路: 选取二维数组左下角元素与目标数进行判断,若相等最好,若不等,目标数大于二维数组中元素,将数组的列下表增1,反之,将数组的行下标减1。再进行判断,直到判断相等为止或相应的下表越界为止,前者表示存在,后者则是不存
2017-10-09 11:02:04
363
原创 二叉树前序后序中序互推总结
最近笔试题一直遇到这个题,今天就总结一下。本文主要回答以下几个问题(Java实现):前序 + 中序 => 后序 + 层序后序 + 中序 => 前序 + 层序以上2个问题的2种解决办法(a. 手写出二叉树 b. 编程实现)先看以下3种遍历的特点:特点:前序的第一个是root,后序的最后一个是root。每种排序左子树右子树分布都是有规律的,见上图。对于每一个子树(左/右)可以看成一个全新
2017-09-19 12:22:39
6782
原创 (Java代码实现)单链表有环的一系列问题
本文主要用Java实现关于单链表有环的5个问题: 1. 判断一个单链表是否存在环? 2. 若存在环,找到环的入口位置? 3. 进一步,计算换上的节点数? 4. 进一步,计算环外的长度、链表的长度? 5. 环上对面的结点如何求?
2017-07-12 12:32:08
921
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人