![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指offer
CYCAO7
这个作者很懒,什么都没留下…
展开
-
剑指offer之编程(十七)
题目描述:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出序列。假设压入栈的所有数字均不相等。例如序列 1,2,3,4,5 是某栈的压入序列,序列 4,5,3,2,1 是该压栈序列对应的一个弹出序列,但 4,3,5,1,2 就不可能是该压栈序列的弹出序列。思路:首先根据题目给出的示例模拟一下压入和弹出栈,已知序列1,2,3,4,5是压入序列,对原创 2017-09-13 21:25:27 · 350 阅读 · 0 评论 -
剑指offer之编程(一)
题目描述: 给定一个链表,从尾部到头部打印输出链表结点的值。思路:看到倒叙输出,那么想到使用栈来处理,因为栈是先进后出。首先遍历一遍链表将每个节点的值入栈,然后依次出栈即可。代码如下:import java.util.*;public class Main6 { public static void main(String[] args) { /原创 2016-04-15 22:40:02 · 407 阅读 · 0 评论 -
剑指offer之编程(二)
题目描述: 请实现一个函数,将一个字符串中的空格替换成“%20”。例如:当字符串为We Are Happy,则经过替换之后的字符串为We%20Are%20Happy。思路:看到此题,首先想到的是String类型的方法:replaceAll(String regex,String replacement),java API 中的解释为:使用给定的 replacement 字符原创 2016-04-24 23:22:53 · 288 阅读 · 0 评论 -
剑指offer之编程(三)
题目描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。思路:刚看到题时的第一反应为,遍历二维数组,每个元素一次判断和这个整数是否相等即可。但这种的时间复杂度比较高,我们可以根据题目,想到更好的算法,注意,题目中行和列的递增这个信息是非常有用的。由于是原创 2016-04-25 23:19:57 · 334 阅读 · 0 评论 -
剑指offer之编程(四)
题目描述:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。思路:很典型的知道前序和中序求整个二叉树的题目,首先看前序遍历,根据前序遍历的规则可以知道,第一个元素时二叉树的根节点,其他的元素则为子数原创 2016-04-27 23:01:38 · 279 阅读 · 0 评论 -
剑指offer之编程(六)
题目描述:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。思路:做这道题前首先要知道什么是斐波那契数列,公式如下:F(0) = 0,F(1) = 1,F(n) = F(n-1)+F(n-2) (n≥2)数列大概为:1,1,2,3,5,8,13,21。。。。。。看到这,我们首先想到利用递归的方式进行原创 2016-05-02 22:24:26 · 301 阅读 · 0 评论 -
剑指offer之编程(七)
题目描述:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。比如输入9,9的二进制表示是1001,1的个数是2,所以输出2。思路:首先看到题目,一般的思路是进行右移操作,但这里注意一点,右移操作时要考虑符号位,如果是负数要进行相应的判断,否则会陷入死循环。除此之外还有一个更好的办法,来看一个例子:0110(十进制为6),那么6-1是5(0101),当我们只原创 2016-05-03 22:31:32 · 307 阅读 · 0 评论 -
剑指offer之编程(八)
题目:实现函数 double Power(double base, int exponent),求base的exponent次方。(不使用库函数,不考虑大数问题)思路:看到题目,我们首先想到的是常规的进行循环乘,求出exponent次方,当然这里要注意正数,负数,0和1这几个特殊情况的判断。(尤其是在判断例如base是否为0时,由于base是double类型的,所以不能使原创 2016-05-21 19:38:19 · 282 阅读 · 0 评论 -
剑指offer之编程(九)
题目描述:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分。思路:看到题目,由于题目要求是将所有的偶数都放在后半部分,可以想到遍历数组,遇到一个偶数就将其放到数组最后,这样遍历一次数组即可完成。另一种比较好的是使用快排的思路,熟悉快排就可以知道,可以使用两个指针 head 和 tail,分原创 2016-05-22 23:20:06 · 283 阅读 · 0 评论 -
剑指offer之编程(十)
题目描述:输入一个链表,输出该链表中倒数第k个结点。思路:看到题目,首先想到普通的解法,由于是链表并不是双向链表,所以要找倒数第k个,那么就要从头开始找,利用倒数第k个就是正数第n-k+1个,所以找到第n-k+1个即可,现在的问题就是n(链表的大小),所以还要遍历一遍链表得到链表的大小n。这样需要遍历大概两次链表,感觉这样一个问题要有两个循环很浪费空间,所以,仔原创 2016-05-24 22:10:49 · 316 阅读 · 0 评论 -
剑指offer之编程(十一)
题目描述:输入一个链表,反转链表后,输出链表的所有元素。思路:首先,看到题目要首先进行分析,要反转链表,那么就必须调整指针的指向,例如:有依次3个链表节点A,B,C,现在我们将B的指针指向A,这时B和C之间就断掉了,所以,需要这3个节点的副本来当做中间过度节点,来保证不会断链。(依然要考虑代码的健壮性,如:这个链表是否为空,链表是否只有1个节点等)原创 2016-05-25 22:43:42 · 245 阅读 · 0 评论 -
剑指offer之编程(十二)
题目描述:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。思路:由于两个链表是递增的,所以,在合并成一个单调不递减的链表的时候,可以使用如下算法进行:每次都比较这两个链表的头结点,把小的节点拿出形成新的链表,在原来的链表上去掉这个节点。这时就又有两个链表,再使用上述方法进行即可,显然,这是一个递归的问题。(这里同样注意原创 2016-05-26 13:27:18 · 333 阅读 · 0 评论 -
剑指offer之编程(十三)
题目描述:输入两颗二叉树A,B,判断B是不是A的子结构。思路:题目已经指出是二叉树,B是A的子结构即B是否为A的一部分。大概分为两步:1.首先通过B的根节点,遍历A树找此节点在A中的位置。2.找到相应的根节点后,就分别比较B的子树和找到的节点的子树,如果相同,那么B就是A的子结构;如果不相同,那么就不是A的子结构。(注意A,B树是否为空,树的边界判断是非常重要的,一不小原创 2016-05-27 22:41:46 · 332 阅读 · 0 评论 -
剑指offer之编程(十四)
题目描述:操作给定的二叉树,将其变换为源二叉树的镜像。 思路:看到镜像,可能会想不起来是什么,那么就用剑指offer里面的图来解释吧,其实就是在这两个图之间放一面镜子,镜像就是镜子里面的二叉树。上面蓝色的线表示镜子。知道了原理那么算法思路就比较好想了:使用前序遍历,每遇到一个结点,如果这个结点有子结点,那么就交换子结点,直到遍历完成。(前原创 2016-05-29 17:39:01 · 338 阅读 · 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,2,3原创 2016-10-25 18:18:43 · 229 阅读 · 0 评论 -
剑指offer之编程(十六)
题目描述:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数,在该栈中,调用min,pop,push的时间复杂度都是O(1)。思路:首先要注意题目的要求,是定义栈的数据结构,写一个函数min得到栈对的最小元素,也就是说,不管栈是怎么变的,这个函数得到的都是当前栈的最小元素,并不是弹出栈中最小元素等操作(由于讨论时有同学提出疑问,问题就是理解错了题目,既然原创 2016-10-26 14:47:44 · 255 阅读 · 0 评论 -
剑指offer之编程(五)
题目描述:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。思路:栈是先进后出,队列是先进先出。要利用两个栈实现队列,Push方法相当于向栈1中入栈,而Pop方法就需要思考一下,具体为当元素全部压入栈1后,再出栈,然后将出栈的元素依次压入栈2,直到栈1中只剩下最后一个元素,然后将这个元素出栈输出,即为队列的第一个元素出列,然后再将栈2中原创 2016-05-01 12:39:50 · 287 阅读 · 0 评论