
剑指Offer系列
康斯坦奇
邻舍老翁来收网,我是临渊不羡鱼!
展开
-
剑指Offer(十二):数值的整数次方
解法:当指数为负数的时候,可以先对指数求绝对值,然后算出次方的结果之后再取倒数。如果底数为0,则直接返回0。此时的次方在数学上是没有意义的。除此之外,我们要注意:由于计算机表示小数(包括float和double型小数)都有误差,我们不能直接用等号(==)判断两个小数是否相等。如果两个小数的差的绝对值很小,比如小于0.0000001,就可以认为它们相等。class Solution: # ...原创 2019-10-30 14:43:52 · 116 阅读 · 0 评论 -
剑指Offer(十一):二进制中1的个数
解法:如果一个整数不为0,那么这个整数至少有一位是1。如果我们把这个整数减1,那么原来处在整数最右边的1就会变为0,原来在1后面的所有的0都会变成1(如果最右边的1后面还有0的话)。其余所有位将不会受到影响。举个例子:一个二进制数1100,从右边数起第三位是处于最右边的一个1。减去1后,第三位变成0,它后面的两位0变成了1,而前面的1保持不变,因此得到的结果是1011.我们发现减1的结果是把最右边...原创 2019-10-25 11:17:05 · 111 阅读 · 0 评论 -
剑指Offer(二十):包含min函数的栈
解法1:对于python来讲,栈就是用list实现的!class Solution: def __init__(self): self.stack = [] self.assist = [] def push(self,node): min = self.min() if not min or node < m...原创 2019-09-19 21:33:31 · 137 阅读 · 0 评论 -
剑指Offer(四十九):把字符串转换成整数
解法1:这道题要考虑全面,对异常值要做出处理。对于这个题目,需要注意的要点有:·指针是否为空指针以及字符串是否为空字符串;·字符串对于正负号的处理;·输入值是否为合法值,即小于等于’9’,大于等于’0’;·int为32位,需要判断是否溢出;class Solution: def StrToInt(self, s): # write code here ...原创 2019-09-19 19:42:32 · 117 阅读 · 0 评论 -
剑指Offer(四十四):翻转单词顺序序列
解法1:字符串拼接class Solution: def ReverseSentence(self, s): # write code here string = s.split(' ') result = '' for i in string[::-1]: result += i + ' ' ...原创 2019-09-19 19:10:38 · 116 阅读 · 0 评论 -
剑指Offer(四十三):左旋转字符串
解法1:简单方法,直接字符拼接class Solution: def LeftRotateString(self, s, n): # write code here new1 = s[:n] new2 = s[n:] new = new2 + new1 return new...原创 2019-09-19 19:02:50 · 105 阅读 · 0 评论 -
剑指Offer(三十四):第一个只出现一次的字符
解法1:建立哈希表,第一次扫描的时候,统计每个字符的出现次数。第二次扫描的时候,如果该字符出现次数为1,则返回这个字符的位置!class Solution: def FirstNotRepeatingChar(self, s): # write code here if len(s) == 0: return -1 ...原创 2019-09-18 14:14:10 · 117 阅读 · 0 评论 -
剑指Offer(二十七):字符串的排列
解法1:求整个字符串的排列,可以看成两步:首先求出所有可能出现在第一个位置的字符,即把第一个字符和后面所有的字符交换。如下图所示:上图就是分别把第一个字符a和后面的b、c等字符交换的情形。首先固定第一个字符,求后面所有字符的排列。这个时候我们仍把后面的所有字符分为两部分:后面的字符的第一个字符,以及这个字符之后的所有字符。然后把第一个字符逐一和它后面的字符交换。class Solution:...原创 2019-09-18 14:11:58 · 117 阅读 · 0 评论 -
剑指Offer(二):替换空格
解法1:直接遍历class Solution: # s 源字符串 def replaceSpace(self, s): # write code here if len(s) == 0: return '' string = '' for i in range(len(s)): ...原创 2019-09-18 10:09:15 · 114 阅读 · 0 评论 -
剑指Offer(五十一):构建乘积数组
解法1:直观解法就是用连乘n-1个数字得到B[i],但是这个方法的时间复杂度是O(n*n)。class Solution: def multiply(self, A): # write code here B = [1 for i in A] for i in range(len(B)): for j in A[:i...原创 2019-09-18 09:34:11 · 123 阅读 · 0 评论 -
剑指Offer(五十):数组中重复的数字
解法1:哈希表class Solution: # 这里要特别注意~找到任意重复的一个值并赋值到duplication[0] # 函数返回True/False def duplicate(self, numbers, duplication): # write code here if len(numbers) == 0: ...原创 2019-09-17 19:47:13 · 127 阅读 · 0 评论 -
剑指Offer(三十七):数字在排序数组中出现的次数
解法1:利用二分查找方法找到k第一次出现的位置,如果k大于中间值,则k在中间值的右面,如果小于中间值,则k在中间值的左面,k等于中间的话,直接返回,然后向两边扩展进行计数!class Solution: def GetNumberOfK(self, data, k): # write code here mlen = len(data) i...原创 2019-09-17 16:48:55 · 104 阅读 · 0 评论 -
剑指Offer(三十五):数组中的逆序对
解法1:分治思想,采用归并排序的思路来处理class Solution: def InversePairs(self, data): # write code here if not data: return 0 temp = [i for i in data] return self.mergeSo...原创 2019-09-17 16:07:58 · 92 阅读 · 0 评论 -
剑指Offer(五十二):正则化表达式
考虑的情况太多了,目前还没搞懂,先把代码贴上!class Solution: # s, pattern都是字符串 def match(self, s, pattern): # write code here if len(s) == 0 and len(pattern) == 0: return True e...原创 2019-09-19 20:36:43 · 97 阅读 · 0 评论 -
剑指Offer(五十三):表示数值的字符串
解法1:在数值之前可能有一个表示正负的’+‘或者’-’。接下来是若干个0到9的数位表示数值的整数部分(在某些小数里可能没有数值的整数部分)。如果数值是一个小数,那么在小数后面可能会有若干个0到9的数位表示数值的小数部分。如果数值用科学记数法表示,接下来是一个’e’或者’E’,以及紧跟着的一个整数(可以有正负号)表示指数。判断一个字符串是否符合上述模式时,首先看第一个字符是不是正负号。如果是,在字...原创 2019-09-19 20:47:07 · 121 阅读 · 0 评论 -
剑指Offer(五):用两个栈实现队列
解法1:初始化两个空栈,当stack2中不为空时,在stack2中的栈顶元素是最先进入队列的元素,可以弹出。如果stack2为空时,我们把stack1中的元素逐个弹出并压入stack2.由于先进入队列的元素被压到stack1的栈底,经过弹出和压入之后就处于stack2的栈顶,又可以直接弹出。如果有新元素d插入,我们直接把它压入stack1即可!class Solution: def __...原创 2019-09-19 21:08:53 · 87 阅读 · 0 评论 -
剑指Offer(六十六):机器人的运动范围
解法1:利用回溯法解决!class Solution: def movingCount(self, threshold, rows, cols): # write code here self.rows = rows self.cols = cols self.count = 0 self._dict ={}...原创 2019-09-23 11:27:35 · 159 阅读 · 0 评论 -
剑指Offer(三十七):数字在排序数组中出现的次数
解法1:利用二分查找方法找到k第一次出现的位置,如果k大于中间值,则k在中间值的右面,如果小于中间值,则k在中间值的左面,k等于中间的话,直接返回,然后向两边扩展进行计数!class Solution: def GetNumberOfK(self, data, k): # write code here mlen = len(data) i...原创 2019-09-23 09:52:00 · 85 阅读 · 0 评论 -
剑指Offer(六十五):矩阵中的路径
解法1:首先,遍历这个矩阵,我们很容易就能找到与字符串str中第一个字符相同的矩阵元素ch。然后遍历ch的上下左右四个字符,如果有和字符串str中下一个字符相同的,就把那个字符当作下一个字符(下一次遍历的起点),如果没有,就需要回退到上一个字符,然后重新遍历。为了避免路径重叠,需要一个辅助矩阵来记录路径情况。下面代码中,当矩阵坐标为(row,col)的格子和路径字符串中下标为pathLength的...原创 2019-09-21 11:29:44 · 115 阅读 · 0 评论 -
剑指Offer(十):矩形覆盖
解法1:就是一个斐波那契数列!class Solution: def rectCover(self, number): # write code here if number <= 3: return number first,second,third = 1,2,0 for i in rang...原创 2019-09-21 10:00:18 · 146 阅读 · 1 评论 -
剑指Offer(九):变态跳台阶
解法1:直接找规律class Solution: def jumpFloorII(self, number): # write code here return 2**(number-1)#2的(n-1)幂,找规律就能得出原创 2019-09-21 09:45:51 · 94 阅读 · 0 评论 -
剑指Offer(八):跳台阶
解法:1递归很好写,但是存在很严重的效率问题!class Solution: def jumpFloor(self, number): # write code here if number <= 2: return number return self.jumpFloor(number-1)+self.jum...原创 2019-09-21 09:44:05 · 142 阅读 · 0 评论 -
剑指Offer(七):斐波那契数列
解法1:这道题递归很好写,但是存在很严重的效率问题。class Solution: def Fibonacci(self, n): # write code here if n == 0: return 0 if n == 1: return 1 return self.Fib...原创 2019-09-20 11:42:46 · 119 阅读 · 0 评论 -
剑指Offer(二十一):栈的压入、弹出序列
解法1:借用一个辅助栈,遍历压栈顺序,先将第一个放入栈中,这里是1,然后判断栈顶元素是不是出栈顺序的第一个元素,这里是4,很显然1!=4,所以我们继续压栈,直到相等以后开始出栈,出栈一个元素,则将出栈顺序向后移动一位,直到不相等,这样循环等压栈顺序遍历完成,如果辅助栈还不为空,说明弹出序列不是该栈的弹出顺序!class Solution: def IsPopOrder(self, pus...原创 2019-09-20 11:02:41 · 102 阅读 · 0 评论 -
剑指Offer(二十):包含min函数的栈
解法1:对于python来讲,栈就是用list实现的!class Solution: def __init__(self): self.stack = [] self.assist = [] def push(self,node): min = self.min() if not min or node < m...原创 2019-09-20 08:29:46 · 116 阅读 · 0 评论 -
剑指Offer(三十二):把数组排成最小的数
解法1:在这里我们自己定义一个规则,对拼接后的字符串进行比较。排序规则如下:若ab > ba 则 a 大于 b,若ab < ba 则 a 小于 b,若ab = ba 则 a 等于 b;根据上述规则,我们需要先将数字转换成字符串再进行比较,因为需要串起来进行比较。比较完之后,按顺序输出即可。class Solution: def PrintMinNumber(self, num...原创 2019-09-17 09:56:03 · 97 阅读 · 0 评论 -
剑指Offer(三十):连续子数组的最大和
解法1:累加的子数组和,如果大于零,那么就继续累加就行。否则,则需要剔除原来的累加和重新开始!class Solution: def FindGreatestSumOfSubArray(self, array): # write code here if len(array) == 0: return 0 maxSu...原创 2019-09-17 09:22:25 · 121 阅读 · 0 评论 -
剑指Offer(三十二):数组中出现次数超过一半的数字
解法1:数组中有一个数字出现的次数超过数组长度的一半,也就是说它出现的次数比其他所有数字出现次数的和还要多。因此我们可以考虑在遍历数组的时候保存两个值:一个是数组的一个数字,一个是次数。当我们遍历到下一个数字的时候,如果下一个数字和我们之前保存的数字相同,则次数加1;如果下一个数字和我们之前保存的数字不同,则次数减1。如果次数为零,我们需要保存下一个数字,并把次数设为1。由于我们要找的数字出现的次...原创 2019-09-17 08:54:33 · 115 阅读 · 0 评论 -
剑指Offer(二十二):从上往下打印二叉树
解法1:考察层序遍历的知识点class Solution: # 返回从上到下每个节点值列表,例:[1,2,3] def PrintFromTopToBottom(self, root): # write code here result = [] if root == None: return result...原创 2019-09-15 10:01:13 · 105 阅读 · 0 评论 -
剑指Offer(十八):二叉树的镜像
解法1:在递归之前,交换左右子树(在递归之后也行)class Solution: # 返回镜像树的根节点 def Mirror(self, root): # write code here if root == None: return root1 = root.left root.left...原创 2019-09-15 09:54:02 · 96 阅读 · 0 评论 -
剑指Offer(十七):树的子结构
解法1:利用嵌套和递归,当两个树的根相同时,判断后面的子树是否相同。当两个树不相同时,分别判断左子树和右子树的情况!class Solution: def HasSubtree(self, pRoot1, pRoot2): # write code here result = False if pRoot1 != None and pRoo...原创 2019-09-15 08:47:35 · 114 阅读 · 0 评论 -
剑指Offer(四):重建二叉树
解法1:前序遍历的第一个数为树的根,而中序遍历中根所在位置的左面的序列即为左子树的中序遍历,右面即为右子树的中序遍历,递归找到每个子树的根就OK了!class Solution: # 返回构造的TreeNode根节点 def reConstructBinaryTree(self, pre, tin): # write code here if le...原创 2019-09-14 11:33:14 · 94 阅读 · 0 评论 -
剑指Offer(五十六):删除链表中重复的结点
解法1:使用递归方法,判断指向下一个结点与上一个节点是否相等。class Solution: def deleteDuplication(self, pHead): # write code here if pHead == None or pHead.next == None: return pHead if pH...原创 2019-09-14 11:13:39 · 96 阅读 · 0 评论 -
剑指Offer(五十五):链表中环的入口节点
解法1:假设x为环前面的路程(黑色路程),a为环入口到相遇点的路程(蓝色路程,假设顺时针走), c为环的长度(蓝色+橙色路程)当快慢指针相遇的时候:此时慢指针走的路程为Sslow =x + m xc + a,快指针走的路程是为Sfast=x+nxc+a。因为2Sslow=Sfast,所以有2x(x + mx c + a)=(x+nxc+a),从而可以推导出:x = (n- 2 * m )*c...原创 2019-09-14 10:08:57 · 100 阅读 · 0 评论 -
剑指Offer(三十六):两个链表的第一个公共结点
解法1:不需要存储链表的额外空间,也不需要提前知道链表的长度。看下面的链表例子:0-1-2-3-4-5-nulla-b-4-5-null代码的ifelse语句,对于某个指针p1来说,其实就是让它跑了连接好的的链表,长度就变成一样了。如果有公共结点,那么指针一起走到末尾的部分,也就一定会重叠。看看下面指针的路径吧。p1: 0-1-2-3-4-5-null(此时遇到ifelse)-a-b-4-5-nu...原创 2019-09-14 09:15:49 · 101 阅读 · 0 评论 -
剑指Offer(二十五):复杂链表的复制
解法1:首先在旧链表中创建新链表,此时不处理新链表的兄弟结点;然后根据旧链表的兄弟结点,初始化新链表的兄弟结点;最后从旧链表中拆分得到新链表。class Solution: # 返回 RandomListNode def Clone(self, pHead): # write code here if pHead == None: ...原创 2019-09-13 10:37:03 · 120 阅读 · 0 评论 -
剑指Offer(十六):合并两个排序的链表
解法1:利用递归的方法进行合并。class Solution: # 返回合并后列表 def Merge(self, pHead1, pHead2): # write code here if pHead1 == None: return pHead2 if pHead2 == None: ...原创 2019-09-12 22:58:34 · 99 阅读 · 0 评论 -
剑指Offer(十五):反转链表
解法1:每反转一个结点,把pHead结点的下一个结点指向new,new指向pHead成为反转后首结点,再把pHead向前移动一个结点直至None结束。class Solution: def ReverseList(self, pHead): # write code here if pHead == None: return ...原创 2019-09-12 22:56:16 · 105 阅读 · 0 评论 -
剑指Offer(十四):链表中倒数第K个节点
解法1:从头到尾遍历存储成列表,然后反转,注意返回的是节点。class Solution: def FindKthToTail(self, head, k): # write code here if head == None: return None result = [] while head:...原创 2019-09-12 22:52:16 · 93 阅读 · 0 评论 -
剑指Offer(二十四):二叉树中和为某一值的路径
解法1:深度优先搜索算法,首先递归先序遍历树, 把结点加入路径。若该结点是叶子结点则比较当前路径和是否等于期待和。弹出结点,每一轮递归返回到父结点时,当前路径也应该回退一个结点!class Solution: # 返回二维列表,内部每个列表表示找到的路径 def FindPath(self, root, expectNu...原创 2019-09-15 10:29:27 · 81 阅读 · 0 评论