ACM-剑指offer
文章平均质量分 58
有一种宿命叫无能为力
即便梦想依旧遥不可及,我依然矢志不渝的前进
原博客链接:http://blog.csdn.net/wuxiushu
展开
-
二叉搜索树与双向链表(二叉搜索树转化为双向链表)
题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。题意分析:题目中并没有明确说明是转化为从小到大排序的双向链表还是从大到小的双向链表,所以估摸着应该都对,这里是从小到大排序的。定义一个全局变量,用来指向左子树的最后一个结点# -*- coding:utf-8 -*-class TreeNo原创 2017-01-29 17:25:51 · 637 阅读 · 0 评论 -
二叉树中和为某一值的路径(二叉树+DFS)
题目描述输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。找出和满足某一值的所有的路径# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x#原创 2017-01-28 14:44:47 · 330 阅读 · 0 评论 -
树的子结构(二叉树)
题目描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right =原创 2017-01-28 13:52:39 · 419 阅读 · 0 评论 -
数据流中的中位数
题目描述如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。简单题:找中位数# -*- coding:utf-8 -*-class Solution: x = [] def Insert(self, num):原创 2017-01-28 13:18:59 · 271 阅读 · 0 评论 -
从上往下打印二叉树(二叉树)
题目描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。由题目很容易知道,层次遍历,用列表模拟队列操作即可# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None#原创 2017-01-27 13:51:14 · 351 阅读 · 0 评论 -
二叉树的深度(二叉树)
题目描述输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。依题意可知:求当前二叉树的深度# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x#原创 2017-01-27 14:00:54 · 640 阅读 · 0 评论 -
把二叉树打印成多行(二叉树的层次遍历)
题目描述从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。二叉树的层次遍历,对于每一层的元素放在同一个列表中即可# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None#原创 2017-01-28 13:00:46 · 485 阅读 · 0 评论 -
已知二叉树的前序遍历和中序遍历重建二叉树(二叉树)
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。二叉树前序遍历中,第一个元素总是根节点的值,中序遍历,左子树的结点的值位于根节点值的左边,右子树的节点的值位于根节点值的右边。原创 2017-01-27 15:10:46 · 1499 阅读 · 0 评论 -
机器人的运动范围(DFS)
题目描述地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?DFS实现,不需要回溯,原创 2017-01-26 21:17:27 · 445 阅读 · 2 评论 -
矩阵中的路径(DFS)
题目描述请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 a b c e s f c s a d e e 矩阵中包含一条字符串"bccced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字原创 2017-01-26 19:21:21 · 1109 阅读 · 0 评论 -
字符流中第一个不重复的字符
题目描述请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。 输出描述:如果当前字符流没有存在出现一次的字符,返回#字符。不知道后台测试代码是什么样子的,看着输出样例不知道什么意思,要表达什么# -*- co原创 2017-01-26 16:05:49 · 233 阅读 · 0 评论 -
滑动窗口的最大值
题目描述给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],原创 2017-01-26 15:32:57 · 356 阅读 · 0 评论 -
正则表达式匹配(re.match)
题目描述请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配# -*- coding:utf-8 -*-import reclass原创 2017-01-26 15:12:40 · 1764 阅读 · 0 评论 -
把字符串转换成整数(try-except)
题目描述将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0 输入描述:输入一个字符串,包括数字字母符号,可以为空输出描述:如果是合法的数值表达则返回该数字,否则返回0输入例子:+2147483647 1a33输出例子:2147483647 0# -*- cod原创 2017-01-26 14:36:08 · 836 阅读 · 0 评论 -
构建乘积数组
题目描述给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。不能使用除法。题意分析:仔细观察乘法的式子,对于每一个B[i],在A[i]相乘的时候都不含有A[i]这个元素# -*- coding:utf-8 -*-cla原创 2017-01-26 14:32:16 · 294 阅读 · 0 评论 -
平衡二叉树(二叉树深度+DFS)
题目描述输入一棵二叉树,判断该二叉树是否是平衡二叉树。平衡二叉树:又称AVL树,具有如下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树(即每一个结点的左右子树)。# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):#原创 2017-01-28 15:56:58 · 611 阅读 · 0 评论 -
按之字形顺序打印二叉树(二叉树的层次遍历)
题目描述请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。和把二叉树打印成多行类似,都是对二叉树的层次遍历,只不过这个题要求正序逆序交叉输出# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):原创 2017-01-28 16:14:53 · 598 阅读 · 0 评论 -
二叉搜索树的第k个结点(二叉搜索树结点查找)
题目描述给定一颗二叉搜索树,请找出其中的第k大的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。 二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所原创 2017-01-28 17:59:00 · 1234 阅读 · 0 评论 -
复杂链表的复制(注意深拷贝和浅拷贝的区别)(特殊的双向链表)
题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)题意分析:题目里面说明,不要返回结点的引用,如果这样做了会返回为空。其实说的就是浅拷贝深拷贝和浅拷贝的区别如下??简单的来说就是,在有原创 2017-01-29 12:00:10 · 4172 阅读 · 0 评论 -
获取链表中倒数第k个结点
题目描述输入一个链表,输出该链表中倒数第k个结点。题意分析:注意输出的是结点,并不是结点对应的元素# -*- coding:utf-8 -*-# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solution:原创 2017-01-24 23:04:00 · 267 阅读 · 0 评论 -
反转链表
题目描述输入一个链表,反转链表后,输出链表的所有元素。解题思路:pHead始终指向要反转的结点last 指向反转后的首结点每反转一个结点,把pHead结点的下一个结点指向last, last指向pHead成为反转后首结点, 再把pHead向前移动一个结点直至None结束# -*- coding:utf-8 -*-# class ListNode原创 2017-01-24 23:16:30 · 180 阅读 · 0 评论 -
合并两个排序的链表
题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。# -*- coding:utf-8 -*-# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solution: #原创 2017-01-24 23:56:46 · 300 阅读 · 0 评论 -
删除链表中重复的结点(单链表)
题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5递归,遇到重复的则先把重复的剔除,再把指针后移,没有遇到就直接后移即可。# -*- coding:utf-8 -*-# class ListNode:# def __init__(原创 2017-01-29 00:44:52 · 890 阅读 · 0 评论 -
两个链表的第一个公共结点
题目描述输入两个链表,找出它们的第一个公共结点。思路一:两条相交的链表呈Y型。可以从两条链表尾部同时出发,最后一个相同的结点就是链表的第一个相同的结点。可以利用栈来实现。时间复杂度有O(m + n), 空间复杂度为O(m + n)# -*- coding:utf-8 -*-# class ListNode:# def __init__(self,原创 2017-01-25 17:08:12 · 270 阅读 · 0 评论 -
链表中环的入口结点(单链表)
题目描述一个链表中包含环,请找出该链表的环的入口结点。把所有结点依次存入列表中,每一次存入之前进行判断该结点在链表中是否出现过即可。# -*- coding:utf-8 -*-# class ListNode:# def __init__(self, x):# self.val = x# self.next = None原创 2017-01-29 00:20:59 · 298 阅读 · 0 评论 -
从尾到头打印链表
题目描述输入一个链表,从尾到头打印链表每个节点的值。题意分析:链表的输出操作# -*- coding:utf-8 -*-# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solution: # 返回从原创 2017-01-24 18:15:34 · 212 阅读 · 0 评论 -
二叉树的下一个结点(二叉树中序遍历的使用)
题目描述给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。题意分析:根据题意可知,要查找的是中序遍历当前给定结点的下一个结点。第一种方法,使用递归先把二叉树中序遍历的结果都查找出来,记录,然后对结果进行遍历,查找给定的结点的下一个结点,如果说要查找的结点不是位于结尾,则证明有下一个结点,原创 2017-01-29 00:08:08 · 828 阅读 · 0 评论 -
对称的二叉树(二叉树的镜像操作)
题目描述请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。判断二叉树的对称性,就是把左右子树对应位置的元素进行判断是否相同,如果相同,返回False,否则,返回True如果说二叉树本身为空,也返回False本题与二叉树的镜像(链接)极其相似,思路可以说基本上相同。# -*- coding:utf-8 -原创 2017-01-28 22:31:52 · 443 阅读 · 0 评论 -
二叉搜索树的后序遍历序列(二叉搜索树的应用)
题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。二叉搜索树满足左孩子的每一个结点都小于根结点,右孩子的每一个结点都大于根结点。由于是后序遍历,所以根结点在最后的位置。获取到根结点,通过根结点把左子树和右子树分开,如果左子树和右子树的每个结点的值都满足二叉搜索树的条件(左原创 2017-01-28 21:56:16 · 686 阅读 · 1 评论 -
二叉树的镜像(二叉树的对称性)
题目描述操作给定的二叉树,将其变换为源二叉树的镜像。 输入描述:二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7原创 2017-01-28 21:05:22 · 579 阅读 · 0 评论 -
孩子们的游戏(圆圈中最后剩下的数)(约瑟夫环问题)
题目描述每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0...m-1报数....这样下去原创 2017-01-28 20:33:45 · 651 阅读 · 0 评论 -
序列化二叉树(二叉树的序列化和反序列化)
题目描述请实现两个函数,分别用来序列化和反序列化二叉树# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solut原创 2017-01-28 19:43:07 · 1907 阅读 · 0 评论 -
表示数值的字符串
题目描述请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。使用try-except,如果可以转化为float类型,则证明是数值,返回True,否则抛出异常,返回False#原创 2017-01-26 14:26:27 · 178 阅读 · 0 评论 -
用两个栈实现队列
题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。题意分析:看完题以后云里雾里,实在是不明白题意是什么,看了看通过的代码才明白,如果有疑问的话,看下代码应该可以解决了# -*- coding:utf-8 -*-class Solution: def __init__(self): se原创 2017-01-26 13:26:05 · 202 阅读 · 0 评论 -
包含min函数的栈
题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。没怎么读懂题意,这几个方法给的是C++中的专有名词,了解每一个意思就可以了# -*- coding:utf-8 -*-class Solution: a = [] def push(self, node): # write code here原创 2017-01-25 01:22:45 · 161 阅读 · 0 评论 -
顺时针打印矩阵(方向控制)
题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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.类似于nyoj上面33题的蛇形填空# -*- coding:utf-8 -*-class So原创 2017-01-25 01:06:44 · 421 阅读 · 0 评论 -
调整数组顺序使奇数位于偶数前面
题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。简单题# -*- coding:utf-8 -*-class Solution: def reOrderArray(self, array): # write原创 2017-01-24 22:47:10 · 247 阅读 · 0 评论 -
数值的整数次方
题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。简单题# -*- coding:utf-8 -*-class Solution: def Power(self, base, exponent): # write code here return p原创 2017-01-24 22:41:32 · 195 阅读 · 0 评论 -
矩形覆盖
题目描述我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?题意分析:题目不难,难点在于分析,如果前几个化简对的话很容易就发现是斐波那契序列# -*- coding:utf-8 -*-from itertools import *class Solution: def rec原创 2017-01-24 22:39:20 · 198 阅读 · 0 评论 -
变态跳台阶
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。写出来前四个台阶一共有几种可能,如下所示:台阶 1 2 3 4跳法 1 2 4 8观察可以发现,其实就是 2 ^ (n - 1)# -*- coding:utf-8 -*-class Solution原创 2017-01-24 22:26:12 · 209 阅读 · 0 评论