
算法和数据结构
input_name
嗯嗯
展开
-
[算法和数据结构]之一:栈和队列简析
《算法》这本书写得比较浅显易懂,而且图文并茂呐,所以学起来会快一些,从现在开始要弄一系列的文章做关于这本书的笔记。另外普林斯顿大学在coursera(天呐,虽然注册了但是一次都没有学过的我)上也有这本书同步的公开课,还有另外一门[算法分析](http://aofa.cs.princeton.edu/home/)课,这门课程的作者叶是这本书的作者,据说两门课都不错。计算机程序离不开算法和数据结构呐,转载 2016-09-05 00:00:43 · 543 阅读 · 0 评论 -
[剑指offer学习心得]之:二叉搜索树的后序遍历序列
题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回 true。否则返回 false。假设输入的数组的任意两个数字都互不相同。解题思路在后序遍历得到的序列中, 最后一个数字是树的根结点的值。数组中前面的数字可以分为两部分: 第一部分是左子树结点的值,它们都比根结点的值小: 第二部分是右子树结点的值,它们都比根结点的值大。这就是规律啦,也是一个递归的方式实现。测试用例功原创 2016-10-19 23:50:53 · 325 阅读 · 0 评论 -
[剑指offer学习心得]之:最小的k个数
题目:输入n个整数,找出其中最小的k个数。例如输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。这道题最简单的思路当然就是把输入的n个整数排序,排序之后位于最前面的k个数就是最小的k个数了。这种思路的时间复杂度为O(nlogn)。不过也当然,这种思路是不会得到面试官青睐的,所以要换其他更快的算法。是不是觉得好奇怪,这道题和树的结构有什么关系呢,下面就来认真仔细地谈一下。原创 2016-10-20 11:32:13 · 534 阅读 · 0 评论 -
[剑指offer学习心得]之:从上往下打印二叉树
题目:从上往下打印出二叉树的每个结点,同一层的结点按照从左向右的顺序打印。解题思路其实一想就觉得是宽度优先遍历。当然这样想是不是太粗暴了,循序渐进循序渐进这道题实质就是考察树的遍历算法,只是这种算法不是我们熟知的那三种,所以呢我们可能一下子也想不清楚遍历的过程,所以可以先好好分析一下下面这棵树:8 | \ 6 10 | \ | \ 5 7 9 11按照层次打印顺序决定应原创 2016-10-20 10:14:17 · 548 阅读 · 0 评论 -
[剑指offer学习心得]之:树的子结构
题目:输入两棵二叉树 A 和 B,判断 B 是不是 A 的子结构。二叉树结点的定义:/** * 二叉树的树结点 */ public static class BinaryTreeNode { int value; BinaryTreeNode left; BinaryTreeNode right;}测试用例功能测试(树A和树B都是普通二叉树,树B是或者不是树A的子结原创 2016-10-05 22:49:23 · 335 阅读 · 0 评论 -
[剑指offer学习心得]之:二叉树的深度
题目一:输入一棵二叉树的根结点,求该树的深度。从根结点到叶子点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。二叉树的结点定义private static class BinaryTreeNode { int val; BinaryTreeNode left; BinaryTreeNode right; public BinaryTreeNo原创 2016-10-05 21:17:11 · 363 阅读 · 0 评论 -
[剑指offer学习心得]之:两个链表的第一个公共结点
题目:输入两个链表,找出它们的第一个公共结点。看到这道题,第一个想到的自然是暴力法:第一链表上顺序遍历每个结点,每遍历到一个结点,在第二个链表上顺序遍历每个结点。如果在第二个链表上有一个结点和第一个链表上结点相同,说明两个链表在这个结点上重合,于是找到了它们的公共结点。如果一个长度为m,一个长度为n,时间复杂度就是O(mn)厉害了word哥,找个公共结点花了这么长时间,有没有其他办法?其实还是有的,原创 2016-10-05 19:18:00 · 375 阅读 · 0 评论 -
[剑指offer学习心得]之:反转链表
题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。思路:在单链表的表头临时接入一个节点,然后进行尾插法操作。反转单链表。测试用例最好就是提前想好测试用例,写出代码以后再用事先准备好的测试用例进行检查测试。功能测试(输入的链表含有多个结点、只有一个结点)特殊输入测试(链表头结点为null)代码实现public class ReverseList { publi原创 2016-10-05 17:05:10 · 270 阅读 · 0 评论 -
[剑指offer学习心得]之:链表中倒数第k个结点
题目:输入一个链表,输出该链表中倒数第k 个结点.为了符合大多数人的习惯,本题从 1 开始计数,即链表的尾结点是倒数第 1 个结点.例如一个链表有 6 个结点,从头结点开始它们的值依次是 1 、2、3、4、5 、6。这个个链表的倒数第 3 个结点是值为 4 的结点。刚好以前看到类似的题目,所以可以很快想到要用两个指针遍历。第一个指针从链表头指针开始遍历向前走k-1,第二个指针保持不变;由于两个指针距原创 2016-10-05 15:58:33 · 332 阅读 · 0 评论 -
[剑指offer学习心得]之:在O(1)时间删除链表结点
题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。思路咦,在单向链表中删除一个结点,最常规的做法当然就是从链表头结点开始顺序遍历查找要删除的结点然后删除它,酱紫的话时间复杂度自然为O(n),怎么弄成O(1)呢?我们知道,之所以要从头开始查,是因为我们需要得到将被删除的结点的前面一个结点。在单向链表中,结点中没有指向前一个结点的指针,所以呢就治好从链表头结点开始顺序查找啦原创 2016-10-05 15:10:03 · 306 阅读 · 0 评论 -
[剑指offer学习心得]之:从尾到头打印链表
题目:输入个链表的头结点,从尾到头反过来打印出每个结点的值。测试用例功能测试(输入的链表有多个结点,输入的链表只有一个结点)特殊输入测试(输入的链表头结点为 null)思路我们知道链表是从头到尾输出的,既然要解决这个问题可能很自然地会想到把链表中指针都反过来,改变指向的方向就好了嘛,不过这个会导致链表的结构的改变,你确定面试官会让你这么做嘛?一般来说打印也就是一个只读操作,链表结构的改变通常是原创 2016-10-05 14:18:46 · 306 阅读 · 0 评论 -
[剑指offer学习心得]之:替换空格
题目:请实现一个函数,把字符串中的每个空格替换成”%20”,例如“We are happy.”,则输出“We%20are%20happy.”。其实java中有一个方法可以直接替换:str.replace(" ","%20);当然这是可行的,不过笔试/面试的时候一般是不允许调用现有的api的,它考察的就是你如何解决这样的问题,不然出这个题目就木有意义了。所以,接下来还是要对它进行分析。最直观的做法就是原创 2016-10-05 11:27:31 · 301 阅读 · 0 评论 -
[剑指offer学习心得]之:二维数组中的查找
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。例子:1 2 8 92 4 9 124 7 10 136 8 11 15当我们需要解决一个复杂问题时,一个很有效的办法就是从一个具体问题入手,通过分析简单具体的例子,试图寻找普遍的规律。我们可以从数组的一个角上选取数字来和要查找的原创 2016-10-05 01:56:16 · 441 阅读 · 0 评论 -
[剑指offer学习心得]之:第一个只出现一次的字符
字符串中找出第一个只出现一次的字符。比如说输入“abaccdeff“,则输出“b“。最直观的想法是从头开始扫描这个字符串中的每个字符。当访问某个字符时拿这个字符和后面没个字符 做比较,如果在后面没有发现重复字符,则该字符就是要找的。如果字符串有n个字符,没个字符可能与后面O(n)个字符比较,所以这个思路的时间复杂度为O(n^2)。当然面试官时不会满意这种思路的,要换。除此以外还可以统计每一个字符在该原创 2016-10-04 17:57:05 · 344 阅读 · 0 评论 -
[剑指offer学习心得]之:圆圈中最后剩下的数字
之前学习的都是简单的单向链表,这次要开始学习复杂一点的,比如本文想要接触的就是形成一个环形链表(链表末尾结点指针指向头结点)来解决问题。题目:0, 1, … , n-1 这 n 个数字排成一个圈圈,从数字 0 开始每次从圆圏里删除第 m 个数字。求出这个圈圈里剩下的最后一个数字。这是有名的约瑟夫环问题。有两种方法:一种是经典的用环形链表模拟圆圈的解法;一种是分析每被删除的数字的规律并肢解计算出圆圈中原创 2016-10-10 16:37:31 · 345 阅读 · 0 评论 -
[剑指offer学习心得]之:栈的压入、弹出序列
题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1、2、3、4、5是某栈的压栈序列,序列4、5、3、2、1是该压栈序列对应的一个弹出序列,但4、3、5、1、2就不可能是该压栈序列的弹出序列。解题思路解决这个问题很直观的想法就是建立一个辅助栈,把输入的第一个序列中的数字依次压入该辅助栈,并按照第二个序列的顺序依次从该栈中弹出原创 2016-10-20 15:00:45 · 405 阅读 · 0 评论