剑指offer
dby_freedom
Everythin has a good ending, if it's not, then it's not the end.
展开
-
剑指offer 3. 二维数组中的查找
原题在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。My Answer思路分析直接遍历数组,之前想着尝试如果既然数组向下向右都是递增,对数组从行列由小到大进行遍历时候,如果发现了array[i][j] > target,则可以确定数组不含这个...原创 2018-10-14 20:12:46 · 156 阅读 · 0 评论 -
剑指offer 2. 替换空格
原题请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。My Answer思路分析直接调用python的replace函数,代码如下:# -*- coding:utf-8 -*-# -*- coding:utf-8 -*-class Solution: # s 源字符串...原创 2018-10-15 22:38:56 · 198 阅读 · 0 评论 -
剑指offer 3. 从尾到头打印链表
原题输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。My Answer思路分析直接正序遍历,取出数值,再对result进行反转输出,代码如下:# -*- coding:utf-8 -*-# class ListNode:# def __init__(self, x):# self.val = x# self.next = N...原创 2018-10-15 22:43:00 · 203 阅读 · 0 评论 -
剑指offer 4. 重建二叉树
原题输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。My Answer思路分析算法设计思想: 前序遍历序列的第一个元素为根结点的值,然后在中序遍历序列中寻找根节点的值的位置(索引)。从中序遍历序列的...原创 2018-10-16 09:30:32 · 227 阅读 · 0 评论 -
剑指offer 5. 二叉树的下一个节点
原题输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。Reference Answer解题思路: 分析二叉树的下一个节点,一共有以下情况:二叉树为空,则返回空;节点右孩子存在,则设置一个...原创 2018-10-16 16:48:38 · 240 阅读 · 0 评论 -
剑指offer 6. 用两个栈实现队列
原题用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。Reference Answer解题思路:用两个栈来实现队列的增添元素和删除元素,队列是一种特殊的线性结构,它只允许从队列的开始端(font)删除元素,从队列的末尾(rear)插入元素,特点是先进先出(FIFO)。入队:将s1作为入队操作的栈,当需要添加元素时,将其添加到栈中,要注意两点,若元素都存...原创 2018-10-18 23:49:15 · 182 阅读 · 0 评论 -
剑指offer 7. 旋转数组的最小数字
原题把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。My Answer解题思路:利用二分法进行查找最小数,尤其要注意的是这里判别条件是if end - start ...原创 2018-10-19 09:31:34 · 171 阅读 · 0 评论 -
剑指offer 8. 斐波那契数列
原题大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n<=39Reference Answer解题思路:直接用回溯法了,用递归效率低。# -*- coding:utf-8 -*-class Solution: def Fibonacci(self, n): # write code here ...原创 2018-10-19 09:41:20 · 219 阅读 · 0 评论 -
剑指offer 9. 跳台阶
原题一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。Reference Answer解题思路:典型回溯法,递归也能用,就是效率低。# -*- coding:utf-8 -*-class Solution: def jumpFloor(self, number): # write code he...原创 2018-10-19 09:55:42 · 191 阅读 · 0 评论 -
剑指offer 11. 矩阵覆盖
原题我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?My Answer解题思路:依旧是典型回溯法,只需要找出递归规律即可,完事用回溯法实现。事实上,这个规律开始并没有一眼看出,对于这种情况,可以先尝试做出几个结果之后找规律,如 n=0 时,对应 res[0] = 0,res[1] = 1,res[2] = 2,r...原创 2018-10-19 10:59:01 · 203 阅读 · 0 评论 -
剑指offer 12. 二进制中1的个数
原题输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。My solution (Wrong)# -*- coding:utf-8 -*-class Solution: def NumberOf1(self, n): # write code here abs_n = abs(n) count = 0 wh...原创 2018-10-20 15:27:06 · 305 阅读 · 0 评论 -
剑指offer 13. 数值的整数次方
原题给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。My Answer# -*- coding:utf-8 -*-class Solution: def Power(self, base, exponent): # write code here return base ** (expon...原创 2018-10-20 16:14:37 · 214 阅读 · 0 评论 -
剑指offer 14. 调整数组顺序使奇数位于偶数前面
原题输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。My solution# -*- coding:utf-8 -*-class Solution: def reOrderArray(self, array): # write code here...原创 2018-10-20 16:17:23 · 206 阅读 · 0 评论 -
剑指offer 16. 反转链表
原题输入一个链表,反转链表后,输出新链表的表头。Reference Answer解题思路:对于这种python求解链表题,尤其是本题让返回节点或者值,直接先遍历玩链表转换到 python 的list中,再进行操作,顺风顺水。# class ListNode:# def __init__(self, x):# self.val = x# sel...原创 2018-10-20 17:12:05 · 260 阅读 · 0 评论 -
剑指offer 17. 合并两个排序的链表
原题在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。My Answer思路分析思路很清晰,只是需要注意,创建新链表的方法:head = ListNode(1),最后返回时候是返回的start.next;# -*- coding:utf-8 -*-...原创 2018-10-20 19:52:57 · 182 阅读 · 0 评论 -
剑指offer 18.树的子结构
原题输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)Reference Answer思路分析递归思想,如果根节点相同则递归调用IsSubtree(),如果根节点不相同,则判断root1的左子树和roo2是否相同,再判断右子树和root2是否相同;注意节点为空的条件,HasSubTree中,只要有树为空就返回false; IsSubtree中,要...原创 2018-10-21 09:56:01 · 183 阅读 · 0 评论 -
剑指offer 19. 顺时针打印矩阵
原题输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 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.Reference Answer思路分析时刻定位矩阵的左上角索引坐标和右下角索引坐标。当顺时针转完一圈之后,左上角...原创 2018-10-21 13:59:11 · 220 阅读 · 0 评论 -
剑指offer 21. 包含min函数的栈
原题定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。Reference Answer思路分析思路:使用一个辅助栈保存最小值# -*- coding:utf-8 -*-class Solution: def __init__(self): self.stack = [] self.min_num...原创 2018-10-21 21:47:32 · 206 阅读 · 0 评论 -
剑指offer 22. 栈的压入、弹出序列
原题输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)Reference Answer解题思路:新建一个栈,和一个指向出栈序列第一个元素的指...原创 2018-11-01 15:14:47 · 199 阅读 · 0 评论 -
剑指offer 23. 从上往下打印二叉树
原题从上往下打印出二叉树的每个节点,同层节点从左至右打印。Reference Answer解题思路:思路:用一个临时数组存储需要打印的节点,如打印8时,将6和10存入临时数组# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self...原创 2018-11-01 18:19:41 · 206 阅读 · 0 评论 -
剑指offer 24. 二叉搜索树的后序遍历序列
原题输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。Reference Answer解题思路:二叉搜索树满足左孩子的每一个结点都小于根结点,右孩子的每一个结点都大于根结点。由于是后序遍历,所以根结点在最后的位置。获取到根结点,通过根结点把左子树和右子树分开,如果左子树和右子树的每个结点的值都满足二...原创 2018-11-01 20:35:04 · 295 阅读 · 0 评论 -
剑指offer 25. 二叉树中和为某一值的路径
原题输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)Reference Answer解题思路:其实这个就是一个dfs的问题,遇到的比较多了。# -*- coding:utf-8 -*-# class TreeNode:# d...原创 2018-11-05 13:51:20 · 209 阅读 · 0 评论 -
剑指offer 25. 复杂链表的复制
原题输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)Reference Answer解题思路:这个题是分而治之的做法,很好玩。思想是在原来的链表每个节点后面都复制了一个同样的节点,再修改其指针,最后把偶数节点都抽出来,作为新...原创 2018-11-05 16:16:09 · 228 阅读 · 0 评论 -
剑指offer 26. 二叉搜索树和双向链表
原题输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。Reference Answer解题思路:由于输入的一个二叉搜索树,其左子树大于右子树的值,这位后面的排序做了准备,因为只需要中序遍历即可,将所有的节点保存到一个列表。对这个list[:-1]进行遍历,每个节点的right设为下一个节点,下一个节点的left设为上一个节...原创 2018-11-10 17:09:25 · 279 阅读 · 0 评论 -
剑指offer 28. 数组中出现次数超过一半的数字
原题题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。Reference Answer思路分析首先确定超过字符长度一半的元素:先排序,取出数值中间数值;检查是否是真正超过字符长度一半:遍历数组进行该值出现次数计数,完成鉴...原创 2018-11-14 15:33:01 · 201 阅读 · 0 评论 -
剑指offer 29. 最小的K个数
原题题目:输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。Answer思路分析简单思路:先快排,再取数;# -*- coding:utf-8 -*-class Solution: def GetLeastNumbers_Solution(self, tinput, k): ...原创 2018-11-14 15:50:18 · 215 阅读 · 0 评论 -
剑指offer 30. 连续子数组的最大和
原题题目:HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子...原创 2018-11-14 15:55:32 · 190 阅读 · 0 评论 -
剑指offer 31. 整数中1出现的次数(从1到n整数中1出现的次数)
原题题目:求出1 ~ 13的整数中1出现的次数,并算出 100 ~ 1300的整数中1出现的次数?为此他特别数了一下1 ~ 13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。Answer思路分析先想一个蠢一点的暴力计算法。#...原创 2018-11-14 19:45:38 · 186 阅读 · 0 评论 -
剑指offer 32. 把数组排成最小的数
原题题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。Answer思路分析字节转化成排列组合做,用回溯法,得到所有的排列可能后再转换为int,输出最小值。# -*- coding:utf-8 -*-class Solution: def Prin...原创 2018-11-14 19:47:41 · 342 阅读 · 0 评论 -
剑指offer 33. 丑数
原题题目:把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。Reference Answer思路分析把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺...原创 2018-11-14 19:51:27 · 182 阅读 · 0 评论 -
剑指offer 34. 第一个只出现一次的字符
原题在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).Reference Answer思路分析直接遍历字符串,用python dict进行次数统计,最后返回目标值对应最小的index。# -*- coding:utf-8 -*-class Solution: def ...原创 2018-11-20 20:56:07 · 185 阅读 · 0 评论 -
剑指offer 35. 数组中的逆序对
原题在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).Reference Answer思路分析这道题用python如何都会超时,直接转C++好了。class Solution {public: int InversePairs(vector<int&am原创 2018-11-20 21:02:45 · 319 阅读 · 0 评论 -
剑指offer 36. 两个链表的第一个公共结点
原题输入两个链表,找出它们的第一个公共结点。Reference Answer思路分析将链表中节点放入list后进行操作,对这种确定公共节点,计算数目之类的问题无往不利。# -*- coding:utf-8 -*-# class ListNode:# def __init__(self, x):# self.val = x# self.nex...原创 2018-11-20 21:06:24 · 243 阅读 · 0 评论 -
剑指offer 37. 数字在排序数组中出现的次数
原题输入两个链表,找出它们的第一个公共结点。Reference Answer思路分析蠢一点的方法,直接遍历统计:# -*- coding:utf-8 -*-class Solution: def GetNumberOfK(self, data, k): # write code here count = 0 for x in ...原创 2018-11-20 21:18:03 · 201 阅读 · 0 评论 -
剑指offer 38. 二叉树的深度
原题输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。Reference Answer思路分析想轻松一些,直接广度优先搜索,代码如下:# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x...原创 2018-11-20 21:40:08 · 151 阅读 · 0 评论 -
剑指offer 39. 平衡二叉树
原题输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。Reference Answer思路分析只是在上一题寻找最大深度的基础上加了平衡树判定条件而已:即左右子树的深度相差不能超过1。# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):...原创 2018-11-20 21:42:36 · 186 阅读 · 0 评论 -
剑指offer 40. 数组中只出现一次的数字
原题一个整型数组里除了两个数字之外,其他的数字都出现了偶数次。请写程序找出这两个只出现一次的数字。Reference Answer思路分析只是在上一题寻找最大深度的基础上加了平衡树判定条件而已:即左右子树的深度相差不能超过1。# -*- coding:utf-8 -*-class Solution: # 返回[a,b] 其中ab是出现一次的两个数字 def FindNu...原创 2018-11-20 21:46:18 · 256 阅读 · 0 评论 -
剑指offer 41. 和为S的连续正数序列
原题小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!输出描述:输出所有和为S的连续正数序列。序列内...原创 2018-11-20 21:55:26 · 342 阅读 · 0 评论 -
剑指offer 42. 和为s的两个数字
原题输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。输出描述:对应每个测试案例,输出两个数,小的先输出。Reference Answer思路分析设定两个指针,一个指向数组的起点,一个指向数组的终点,然后对两个数字求和,如果和大于目标值,则把后一个指针前移,如果和小于目标值,则把前一个指针后移。两个指针交汇的...原创 2018-11-24 19:41:35 · 257 阅读 · 0 评论 -
剑指offer 43. 左旋转字符串
原题汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!Reference Answer思路分析直接对应python字符串操作,丝毫无难度。# -*- ...原创 2018-11-24 19:44:39 · 212 阅读 · 0 评论