
剑指offer
ys1305
这个作者很懒,什么都没留下…
展开
-
剑指offer-python 数组中数值和下标相等的元素
题目描述:假设一个单调递增的数组里的每个元素都是整数并且是唯一的。请编程实现一个函数找出数组中任意一个数值等于其下标的元素。例如,在数组[-3, -1, 1, 3, 5]中,数字3和它的下标相等。样例:输入:[-3, -1, 1, 3, 5]输出:3注意:如果不存在,则返回-1。分析:首先想到的方法是对数组从头遍历,当遍历到一个元素和其下标相等时直接返回,如果遍历结束仍没有找到则返回...原创 2019-07-30 10:29:23 · 682 阅读 · 0 评论 -
剑指offer-python 55 二叉树的深度
从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。解题思路利用递归实现。如果一棵树只有一个结点,那么它的深度为1。递归的时候无需判断左右子树是否存在,因为如果该节点为叶节点,它的左右子树不存在,那么在下一级递归的时候,直接return 0。同时,记得每次递归返回值的时候,深度加一操作,因为计算深度是从根节点下面一个节点开始计算的。class Solut...原创 2019-07-19 19:58:40 · 295 阅读 · 0 评论 -
剑指offer-python 53 数字在排序数组中出现的次数
题目描述Input:nums = 1, 2, 3, 3, 3, 3, 4, 6K = 3Output:4解题思路class Solution: def GetNumberOfK(self, data, k): # write code here return data.count(k)找到数字K的左边界 找到数字K+1的左边界clas...原创 2019-07-19 18:44:03 · 100 阅读 · 0 评论 -
剑指offer-python 57 和为 S 的两个数字
输入一个递增排序的数组和一个数字 S,在数组中查找两个数,使得他们的和正好是 S。如果有多对数字的和等于 S,输出两个数的乘积最小的。解题思路使用双指针,一个指针指向元素较小的值,一个指针指向元素较大的值。指向较小元素的指针从头向尾遍历,指向较大元素的指针从尾向头遍历。乘积和最小必然是差值最大的一个组合如果两个指针指向元素的和 sum == target,那么得到要求的结果;如果 su...原创 2019-07-19 18:32:45 · 121 阅读 · 0 评论 -
剑指offer-python 52 两个链表的第一个公共结点
共同节点,意味着从共同节点开始之后所有的节点数都是相同的,这是链表,只要有一个共同节点,那么之后所有的指向也是重复的。先依次遍历两个链表,记录两个链表的长度m和n,如果 m > n,那么我们就先让长度为m的链表走m-n个结点,然后两个链表同时遍历,当遍历到相同的结点的时候停止即可。对于 m < n,同理。class Solution: def FindFirstCommonN...原创 2019-07-19 16:49:30 · 160 阅读 · 0 评论 -
剑指offer-python 50 数组中的逆序对
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。解题思路先将原序列排序,然后从排完序的数组中取出最小的,它在原数组中的位置表示有多少比它大的数在它前面,每取出一个在原数组中删除该元素,保证后面取出的元素在原数组中是最小的,这样其位置才能表示有多少比它大的数在它前面,即逆序对数。代码超时class Solution:...原创 2019-07-19 16:20:55 · 159 阅读 · 0 评论 -
剑指offer-python 47 礼物的最大值
在一个 m*n 的棋盘的每一个格都放有一个礼物,每个礼物都有一定价值(大于 0)。从左上角开始拿礼物,每次向右或向下移动一格,直到右下角结束。给定一个棋盘,求拿到礼物的最大价值。例如,对于如下棋盘1 10 3 812 2 9 65 7 4 113 7 16 5礼物的最大价值为 1+12+5+7+7+16+5=53。解题...原创 2019-07-19 15:35:13 · 216 阅读 · 0 评论 -
剑指offer-python 32 从上往下打印二叉树
从上往下打印出二叉树的每个节点,同层节点从左至右打印。例如,以下二叉树层次遍历的结果为:1,2,3,4,5,6,7 解题思路使用队列来进行层次遍历。不需要使用两个队列分别存储当前层的节点和下一层的节点,因为在开始遍历一层的节点时,当前队列中的节点数就是当前层的节点数,只要控制遍历这么多节点数,就能保证这次遍历的都是当前层的节点。class Solution: # 返回从上到...原创 2019-07-17 10:11:22 · 119 阅读 · 0 评论 -
剑指offer-python 31 栈的压入、弹出序列
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列 1,2,3,4,5 是某栈的压入顺序,序列 4,5,3,2,1 是该压栈序列对应的一个弹出序列,但 4,3,5,1,2 就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)解题思路使用一个栈来模拟压入弹出操作。class Solution: de...原创 2019-07-17 09:26:08 · 107 阅读 · 0 评论 -
剑指offer-python 30 包含min函数的栈
定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的 min 函数。(时间复杂度应为O(1))。解题思路思路非常简单data为主栈,mindata为辅助栈当要入栈的元素小于等于当前最小值,也要进行mindata的入栈操作pop时,要出栈的元素是当前栈中的最小值,data和mindata栈都要进行出栈class Solution: def __init__(self):...原创 2019-07-17 09:00:32 · 100 阅读 · 0 评论 -
剑指Offer-python 48 最长不含重复字符的子字符串
输入一个字符串(只包含 a~z 的字符),求其最长不含重复字符的子字符串的长度。例如对于 arabcacfr,最长不含重复字符的子字符串为 acfr,长度为 4。解题思路遍历字符串中的每一个元素。借助一个辅助键值对来存储某个元素最后一次出现的下标。用一个整形变量存储当前无重复字符的子串开始的下标。class Solution: def lengthOfLongestSubstring...原创 2019-07-19 14:19:16 · 268 阅读 · 0 评论 -
剑指offer-python 23 链表中环的入口结点
一个链表中包含环,请找出该链表的环的入口结点。要求不能使用额外的空间。解题思路使用双指针,一个指针 fast 每次移动两个节点,一个指针 slow 每次移动一个节点。因为存在环,所以两个指针必定相遇在环中的某个节点上。假设相遇点在下图的 z1 位置,此时 fast 移动的节点数为 x+2y+z,slow 为 x+y,由于 fast 速度比 slow 快一倍,因此 x+2y+z=2(x+y),得...原创 2019-07-16 20:46:21 · 136 阅读 · 0 评论 -
剑指offer-python 55 平衡二叉树
平衡二叉树左右子树高度差不超过 1。解题思路如果二叉树的每个节点的左子树和右子树的深度不大于1,它就是平衡二叉树。先写一个求深度的函数,再对每一个节点判断,看该节点的左子树的深度和右子树的深度的差是否大于1class Solution: def IsBalanced_Solution(self, pRoot): # write code here de...原创 2019-07-19 20:26:59 · 302 阅读 · 0 评论 -
剑指offer-python 0到n-1中缺失的数字
一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0到n-1之内。在范围0到n-1的n个数字中有且只有一个数字不在该数组中,请找出这个数字。样例输入:[0,1,2,4]输出:3class Solution(object): def getMissingNumber(self, nums): """ :type nums:...原创 2019-07-29 19:05:25 · 458 阅读 · 0 评论 -
剑指offer-python 57 和为S的连续正数序列
题目描述题目:小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!思路:设定两个指针,先分别指向数字1和...原创 2019-07-20 13:31:41 · 284 阅读 · 0 评论 -
剑指offer-python 66 构建乘积数组
给定一个数组 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[0] = A[1] * A[2] * A[3] * A[4] *....*A[n-1] ;(没有A[0]) B[1 ]= ...原创 2019-07-20 17:26:19 · 189 阅读 · 0 评论 -
剑指offer-python 63 股票的最大利润
可以有一次买入和一次卖出,买入必须在前。求最大收益。 解题思路使用贪心策略,假设第 i 轮进行卖出操作,买入操作价格应该在 i 之前并且价格最低。class Solution: def maxProfit(self, prices): """ :type prices: List[int] :rtype: int "...原创 2019-07-20 16:44:42 · 432 阅读 · 0 评论 -
剑指offer-python 65 不用加减乘除做加法
写一个函数,求两个整数之和,要求不得使用 +、-、*、/ 四则运算符号。解题思路class Solution: def Add(self, num1, num2): # write code here return sum([num1,num2])a ^ b 表示没有考虑进位的情况下两数的和,(a & b) << 1 就是进位。...原创 2019-07-20 16:37:19 · 197 阅读 · 0 评论 -
剑指offer-python 67 把字符串转换成整数
将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。Iuput:+21474836471a33Output:21474836470解题思路class Solution: def StrToInt(self, s)...原创 2019-07-20 16:14:51 · 309 阅读 · 0 评论 -
剑指Offer-Python 35 复杂链表的复制
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的 head。 解题思路第一步,在每个节点的后面插入复制的节点。 第二步,对复制节点的 random 链接进行赋值。 第三步,拆分。 class Solution: # 返回 RandomListNode def Clone(s...原创 2019-07-17 22:41:05 · 176 阅读 · 0 评论 -
剑指Offer-Python 34 二叉树中和为某一值的路径
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)下图的二叉树有两条和为 22 的路径:10, 5, 7 和 10, 12 解题思路# class TreeNode:# def __init__(self, x):# ...原创 2019-07-17 22:16:47 · 224 阅读 · 0 评论 -
剑指Offer-Python 33 二叉搜索树的后续遍历序列
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。假设输入的数组的任意两个数字都互不相同。例如,下图是后序遍历序列 1,3,2 所对应的二叉搜索树。 解题思路二叉搜索树的特点是,左子树的值小于根节点的值,右子树的值大于根节点的值。后序遍历的话是先遍历左子树、再遍历右子树,最后遍历根节点。所以所给序列的最后一个元素为根节点的值。数组中的数字可以分为两个部分:第一部分是左...原创 2019-07-17 21:52:23 · 105 阅读 · 0 评论 -
剑指offer-python 61 扑克牌顺子
LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张_)…他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子…LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。上面的5张牌就可以变...原创 2019-07-20 15:07:03 · 132 阅读 · 0 评论 -
剑指offer-python 59 滑动窗口的最大值
题目描述给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组 {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...原创 2019-07-20 14:35:50 · 156 阅读 · 0 评论 -
剑指offer-python 58 左旋转字符串
题目描述Input:S="abcXYZdef"K=3Output:"XYZdefabc"解题思路class Solution: def LeftRotateString(self, s, n): # write code here if n<1 or len(s)<1: return s ...原创 2019-07-20 14:15:15 · 198 阅读 · 0 评论 -
剑指offer-python 58 翻转单词顺序列
题目描述牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?Input:"I am...原创 2019-07-20 13:54:22 · 122 阅读 · 0 评论 -
剑指Offer-python 64 求 1+2+3+...+n
要求不能使用乘除法、for、while、if、else、switch、case 等关键字及条件判断语句 A ? B : C。解题思路使用递归解法最重要的是指定返回条件,但是本题无法直接使用 if 语句来指定返回条件。条件与 && 具有短路原则,即在第一个条件语句为 false 的情况下不会去执行第二个条件语句。利用这一特性,将递归的返回条件取非然后作为 && ...原创 2019-07-19 09:49:12 · 308 阅读 · 0 评论 -
剑指Offer-python 41 字符流中第一个不重复的字符
请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符 “go” 时,第一个只出现一次的字符是 “g”。当从该字符流中读出前六个字符“google" 时,第一个只出现一次的字符是 “l”。解题思路import collectionsclass Solution: # 返回对应char def __init__(self): s...原创 2019-07-19 09:09:11 · 167 阅读 · 0 评论 -
剑指offer-python 29 顺时针打印矩阵
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.解题思路# -*- coding:utf-8 -*-class Solution: # matrix类型为二维列表,...原创 2019-07-16 20:29:47 · 198 阅读 · 0 评论 -
剑指offer-python 24 链表反转
递归class Solution: # 返回ListNode def ReverseList(self, pHead): # write code here if pHead == None or pHead.next==None: return pHead pre = pHead.next ...原创 2019-07-16 09:51:29 · 138 阅读 · 0 评论 -
剑指offer-python 22 链表中倒数第 K 个结点
输入一个链表,输出该链表中倒数第k个结点。多种情况的考虑链表为空k大于链表的长度解题思路设链表的长度为 N。设置两个指针 P1 和 P2,先让 P1 移动 K 个节点,则还有 N - K 个节点可以移动。此时让 P1 和 P2 同时移动,可以知道当 P1 移动到链表结尾时,P2 移动到第 N - K 个节点处,该位置就是倒数第 K 个节点。 class Solution...原创 2019-07-16 09:19:48 · 105 阅读 · 0 评论 -
剑指offer-python 21 调整数组顺序使奇数位于偶数前面
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。 解题思路class Solution: def reOrderArray(self, array): # write code here l1=[] l2=[] ...原创 2019-07-16 08:20:38 · 112 阅读 · 0 评论 -
剑指offer-python 7 重建二叉树
根据二叉树的前序遍历和中序遍历的结果,重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 解题思路前序遍历的第一个值为根节点的值,使用这个值将中序遍历结果分成两部分,左部分为树的左子树中序遍历结果,右部分为树的右子树中序遍历的结果。 class Solution: # 返回构造的TreeNode根节点 def reConstructBinaryTr...原创 2019-07-10 14:49:08 · 111 阅读 · 0 评论 -
剑指offer-python 6 从尾到头打印链表
从尾到头反过来打印出每个结点的值。 解题思路使用递归要逆序打印链表 1->2->3(3,2,1),可以先逆序打印链表 2->3(3,2),最后再打印第一个节点 1。而链表 2->3 可以看成一个新的链表,要逆序打印该链表可以继续使用求解函数,也就是在求解函数中调用自己,这就是递归函数。class Solution: # 返回从尾部到头部的列表值序列,例如...原创 2019-07-10 13:41:07 · 123 阅读 · 0 评论 -
剑指offer-python5替换空格
将一个字符串中的空格替换成 “%20”。Input:"A B"Output:"A%20B"解题思路在字符串尾部填充任意字符,使得字符串的长度等于替换之后的长度。因为一个空格要替换成三个字符(%20),因此当遍历到一个空格时,需要在尾部填充两个任意字符。令 P1 指向字符串原来的末尾位置,P2 指向字符串现在的末尾位置。P1 和 P2 从后向前遍历,当 P1 遍历到一个空格时,就需...原创 2019-07-10 13:06:38 · 160 阅读 · 0 评论 -
剑指offer-python 20字符串的匹配
使用正则表达式进行匹配。[] : 字符集合() : 分组? : 重复 0 ~ 1 次+ : 重复 1 ~ n 次* : 重复 0 ~ n 次. : 任意字符\\. : 转义后的 .\d : 数字$ 匹配字符串的末尾。class Solution: # s字符串 def isNumeric(self, s): # write ...原创 2019-07-14 14:40:31 · 180 阅读 · 0 评论 -
剑指offer-python 18 删除链表中重复元素
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5# # 用dictionary存一下每个nodes的个数,这样只要看到它是大于1的,就删。class Solution: def deleteDuplication(s...原创 2019-07-14 13:02:38 · 339 阅读 · 0 评论 -
剑指offer-python 16 数值的整数次方
给定一个 double 类型的浮点数 base 和 int 类型的整数 exponent,求 base 的 exponent 次方。解题思路下面的讨论中 x 代表 base,n 代表 exponent。 因为 (x*x)n/2 可以通过递归求解,并且每次递归 n 都减小一半,因此整个算法的时间复杂度为 O(logN)。class Solution: def Power(self,...原创 2019-07-14 10:51:55 · 237 阅读 · 0 评论 -
剑指offer-python 15 二进制中1的个数
输入一个整数,输出该数二进制表示中 1 的个数。n&(n-1)该位运算去除 n 的位级表示中最低的那一位。n : 10110100n-1 : 10110011n&(n-1) : 10110000时间复杂度:O(M),其中 M 表示 1 的个数。特别注意:Python中bin一个负数(十进制表示),输出的是它的原码的二进制表示加上个负号# 这在p...原创 2019-07-14 10:31:10 · 131 阅读 · 0 评论 -
剑指offer-python 3 数组中重复的数字
在一个长度为 n 的数组里的所有数字都在 0 到 n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字是重复的,也不知道每个数字重复几次。请找出数组中任意一个重复的数字。Input:{2, 3, 1, 0, 2, 5}Output:2解题思路要求时间复杂度 O(N),空间复杂度 O(1)。因此不能使用排序的方法,也不能使用额外的标记数组。对于这种数组元素在 [0, n-1...原创 2019-07-10 09:12:52 · 171 阅读 · 0 评论