![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指offer
felinewong
这个作者很懒,什么都没留下…
展开
-
剑指offer: 栈的压入、弹出序列
题目: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的) 思路: 1.创建一个栈来存储出栈入栈过程中的元素 2.每次入栈一个元素,原创 2017-03-18 13:47:25 · 201 阅读 · 0 评论 -
剑指offer: 删除链表中重复的结点
题目: 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 思路: 1.用p表示当前节点,用pre表示之前一个节点 2.若p 与p.next节点值相等,则p向前移动一位; 3.若p与p.next节点不相等,分两种情况考虑 (1)p与pre相邻,说明没有遇到重复,原创 2017-03-20 21:58:56 · 277 阅读 · 0 评论 -
剑指offer: 和为某数相关数组问题
题目一:和为S的连续正数序列 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck! 输出描原创 2017-03-20 12:55:33 · 261 阅读 · 0 评论 -
剑指offer: 顺时针打印矩阵
题目: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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. 思路: 1.声明一个start来记录左上角的坐标 2.循环次数是行列数较小的一半 3.每次转向时应该检查边界原创 2017-03-09 20:50:03 · 170 阅读 · 0 评论 -
剑指offer: 树的子结构
题目: 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构) 思路: 1.创建一个方法用于判定当前节点是不是子树,递归思路 2.主函数先判定当前节点是否为子树,不是则依次比较左右子树 代码: /* public class TreeNode { public int val; public TreeNode le原创 2017-03-09 19:34:42 · 231 阅读 · 0 评论 -
剑指offer: 反转链表
题目: 输入一个链表,反转链表后,输出链表的所有元素。 思路: 1.声明变量pre保存当前调整后的下一个节点 2.声明变量next保存当前节点下一个节点 3.反转当前节点的指向,并向后移动 代码: /* public class ListNode { public int val; public ListNode next; public原创 2017-03-09 19:01:15 · 198 阅读 · 0 评论 -
剑指offer: 调整数组顺序使奇数位于偶数前面
题目: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。 思路: 1.声明变量move来记录遇到过的偶数个数 2.遇到偶数时move++ 3.遇到奇数从当前开始依次交换位置move次 代码: class Solution { pu原创 2017-03-09 18:38:31 · 165 阅读 · 0 评论 -
剑指offer: 平衡二叉树
题目: 输入一棵二叉树,判断该二叉树是否是平衡二叉树。 思路: 1.创建辅助方法,用于计算树的深度。 2.判断当前节点左右子树深度是否满足,然后递归左右子树。 代码: /* public class TreeNode { public int val; public TreeNode left; public TreeNode right; publ原创 2017-03-19 15:49:12 · 216 阅读 · 0 评论 -
剑指offer: 数组中的逆序对
题目: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。即输出P%1000000007 输入描述: 题目保证输入的数组中没有的相同的数字数据范围: 对于%50的数据,size 对于%75的数据,size 对于%100的数据,size 输入例子: 1,2,3,4,5原创 2017-03-19 15:19:31 · 248 阅读 · 0 评论 -
剑指offer: 丑数
题目: 把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。 思路: 1.下一个丑数必定由有数组中的某一个丑数A * 2, B * 3, C * 5 的中的最小值得来。 2.用数组保存丑数 代码: class Solution { public原创 2017-03-19 13:14:48 · 204 阅读 · 0 评论 -
剑指offer: 把数组排成最小的数
题目: 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。 思路: 1.将数组进行排序 2.排序函数为两个数的字符串的拼接 代码: class Solution { public string PrintMinNumber(int[] numbers原创 2017-03-19 12:46:35 · 175 阅读 · 0 评论 -
剑指offer: 二叉搜索树与双向链表
题目: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。 思路: 1.利用递归思想,分别寻找当前节点的左边节点和右边节点 2.寻找当前节点的左边节点时,最后的连接节点是当前节点左子节点树的最右节点 3.最后若当前节点左节点存在,则返回左节点,否则返回当前节点 代码: /* public class Tree原创 2017-03-18 19:14:22 · 151 阅读 · 0 评论 -
剑指offer: 复杂链表的复制
题目: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空) 思路: 1.不考虑随机指针,复制节点并插入其后方位置 2.用两个指针同时遍历,复制随机指针 3.借助一个节点变量,将链表拆成两个 代码: /* public cl原创 2017-03-18 18:32:26 · 199 阅读 · 0 评论 -
剑指offer: 二叉树中和为某一值的路径
题目: 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。 思路: 1.典型的回溯法,用递归进行探索。 2.传递的参数包括:root //当前节点. ,expectNumber //期望值 ,sum//当前总数, list //当前遍历过的节点, ret //保存所有路径的容器 3.只有当满足期原创 2017-03-18 14:52:31 · 170 阅读 · 0 评论 -
剑指offer: 二叉搜索树的后序遍历序列
题目: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。 思路: 1.二叉搜索树的后序遍历特点是前一段数小于最后一个数,后一段数大于最后一个数。 2.设置i=0从左到有遍历,判断是否能到达尾部 3.尾部n每次向右移动一个距离 代码: class Solution { public boo原创 2017-03-18 14:16:11 · 181 阅读 · 0 评论 -
剑指offer: 二叉树的下一个结点
题目: 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。 注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。 思路: 中序遍历过程: 代码: /* public class TreeLinkNode { public int val; public TreeLinkNode left; public TreeLin原创 2017-03-21 15:23:23 · 288 阅读 · 0 评论