剑指offer
面试刷题
TommyLiuZ
这个作者很懒,什么都没留下…
展开
-
剑指 Offer 58 - I. 翻转单词顺序
剑指 Offer 58 - I. 翻转单词顺序1.题目2.官方解决方案使用内置函数class Solution: def reverseWords(self, s: str) -> str: return " ".join(s.strip().split()[::-1])时间复杂度:O(n)O(n)O(n)空间复杂度:O(1)O(1)O(1)...原创 2021-04-06 15:23:09 · 79 阅读 · 0 评论 -
剑指 Offer 29. 顺时针打印矩阵
剑指 Offer 29. 顺时针打印矩阵1.题目2.官方的解决方案模拟顺时针操作class Solution: def spiralOrder(self, matrix: List[List[int]]) -> List[int]: if not matrix or not matrix[0]: # 处理特殊情况 return list() rows, columns = len(matrix), len(matrix[0])原创 2021-04-06 14:38:06 · 109 阅读 · 0 评论 -
剑指 Offer 53 - II. 0~n-1中缺失的数字
剑指 Offer 53 - II. 0~n-1中缺失的数字1.题目2.我的解决方案使用二分查找法(标准的二分查找代码)class Solution: def missingNumber(self, nums: List[int]) -> int: """ 使用二分查找法 中间:索引是不是和数字相等,相等,右半部分,不相等,左半部分 """ low = 0 high = len(nums原创 2021-04-06 10:43:35 · 65 阅读 · 0 评论 -
剑指 Offer 53 - I. 在排序数组中查找数字 I
剑指 Offer 53 - I. 在排序数组中查找数字 I1.题目2.我的解决方案class Solution: def search(self, nums: List[int], target: int) -> int: return nums.count(target)时间复杂度:O(n)O(n)O(n)空间复杂度:O(1)O(1)O(1)3.官方的解决方案防止偷懒,使用二分查找法进行解决思路:点击查看(文字性叙述看不懂就看图)class So原创 2021-04-05 15:03:40 · 74 阅读 · 0 评论 -
剑指 Offer 40. 最小的k个数
剑指 Offer 40. 最小的k个数1.题目2.我的解决方案脑子不要太死没有必要非得逆序排,直接正序排取前面的数就可以了class Solution: def getLeastNumbers(self, arr: List[int], k: int) -> List[int]: arr.sort() return arr[:k]时间复杂度:O(nlogn)O(nlogn)O(nlogn)空间复杂度:O(1)O(1)O(1)...原创 2021-04-05 14:15:45 · 78 阅读 · 0 评论 -
剑指 Offer 61. 扑克牌中的顺子
剑指 Offer 61. 扑克牌中的顺子1.题目2.官方的解决方案class Solution: def isStraight(self, nums: List[int]) -> bool: # 1.公式,顺子的最大值 - 最小值 < 5 恒成立 # 2.判断除了0以外的重复 replace = set() # 用来判重 i = 0 max_p = 14 min_p = 0原创 2021-04-04 15:54:43 · 116 阅读 · 0 评论 -
剑指 Offer 65. 不用加减乘除做加法
剑指 Offer 65. 不用加减乘除做加法1.题目2.官方的解决方案思路:点击查看class Solution: def add(self, a: int, b: int) -> int: # 将python的运算控制在64位 x = 0xffffffff a = a & x b = b & x # 本位:a和b异或 # 进位:a&b右移一原创 2021-04-04 15:04:31 · 83 阅读 · 0 评论 -
剑指 Offer 28. 对称的二叉树
剑指 Offer 28. 对称的二叉树1.题目2.我的解决方案第一次做的时候,想用中序遍历+列表的方式,但是奈何由于不能将遍历结果存储起来,非常苦恼第二次做,能将遍历结果存储起来,但是发现这种思路是错的# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# sel原创 2021-04-04 11:41:19 · 80 阅读 · 0 评论 -
剑指 Offer 55 - II. 平衡二叉树
剑指 Offer 55 - II. 平衡二叉树1.题目2.我的解决方案这道题没有做出来,有点死脑筋,判断了False但是不知道True怎么判断# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution:原创 2021-04-04 10:59:35 · 69 阅读 · 0 评论 -
剑指 Offer 18. 删除链表的节点
剑指 Offer 18. 删除链表的节点1.题目2.我的解决方案这个很简单# Definition for singly-linked list.# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solution: def deleteNode(self, head: ListNode, val: int) -> ListN原创 2021-04-04 10:15:22 · 81 阅读 · 0 评论 -
剑指 Offer 42. 连续子数组的最大和
剑指 Offer 42. 连续子数组的最大和1.题目2.我的解决方案这道题之前做过,还有点印象,果然刷题是有用的class Solution: def maxSubArray(self, nums: List[int]) -> int: res_max = -math.inf pre = 0 # 用来保存正在尝试中的连续和 for i in range(len(nums)): pre = max(nums[i原创 2021-04-04 09:59:19 · 83 阅读 · 0 评论 -
剑指 Offer 50. 第一个只出现一次的字符
剑指 Offer 50. 第一个只出现一次的字符1.题目2.我的解决方案class Solution: def firstUniqChar(self, s: str) -> str: frequency = collections.Counter(s) for i, ch in enumerate(s): if frequency[ch] == 1: return ch原创 2021-04-03 15:33:37 · 75 阅读 · 0 评论 -
剑指 Offer 52. 两个链表的第一个公共节点
剑指 Offer 52. 两个链表的第一个公共节点1.题目2.我的解决方案# Definition for singly-linked list.# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solution: def getIntersectionNode(self, headA: ListNode, headB: ListNo原创 2021-04-03 14:56:38 · 78 阅读 · 0 评论 -
剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
剑指 Offer 21. 调整数组顺序使奇数位于偶数前面1.题目2.我的解决方案缺点:效率低class Solution: def exchange(self, nums: List[int]) -> List[int]: for i in range(len(nums)): if nums[i]%2 != 0: nums.insert(0, nums.pop(i)) return nums原创 2021-04-03 14:29:53 · 66 阅读 · 0 评论 -
剑指 Offer 62. 圆圈中最后剩下的数字
剑指 Offer 62. 圆圈中最后剩下的数字1.题目2.我的解决方案超出时间限制变相的约瑟夫环问题class Solution: def lastRemaining(self, n: int, m: int) -> int: res = [i for i in range(n)] # 形成列表 count = 0 # 控制什么时候应该进行删除 i = 0 # 指针,删除i对应的元素 while len(r原创 2021-04-03 10:32:10 · 68 阅读 · 0 评论 -
剑指 Offer 57. 和为s的两个数字
剑指 Offer 57. 和为s的两个数字1.题目2.官方的解决方案class Solution: def twoSum(self, nums: List[int], target: int) -> List[int]: # 什么问题:数组问题 # 什么特征:排序,查找等 # 一般有什么解决方法? 双指针、二分查找等 # 采用双指针法 # 跳过的都是没用的 i, j = 0, len(nu原创 2021-03-31 09:38:45 · 81 阅读 · 0 评论 -
剑指 Offer 32 - II. 从上到下打印二叉树 II
剑指 Offer 32 - II. 从上到下打印二叉树 II1.题目2.我的解决方案二叉树的广度优先遍历# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution: def levelOrder原创 2021-03-30 13:53:04 · 69 阅读 · 1 评论 -
剑指 Offer 68 - I. 二叉搜索树的最近公共祖先
剑指 Offer 68 - I. 二叉搜索树的最近公共祖先1.题目2.我的解决方案递归# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution: def lowestCommonAncestor(原创 2021-03-30 11:20:29 · 167 阅读 · 0 评论 -
剑指 Offer 68 - II. 二叉树的最近公共祖先
剑指 Offer 68 - II. 二叉树的最近公共祖先1.题目2.官方的解决方案非常简单且执行效率很高的思路# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution: def lowestC原创 2021-03-30 10:46:54 · 64 阅读 · 0 评论 -
剑指 Offer 57 - II. 和为s的连续正数序列
剑指 Offer 57 - II. 和为s的连续正数序列1.题目2.我的解决方案第一次做:回溯法,时间和空间效率都很低class Solution: def findContinuousSequence(self, target: int) -> List[List[int]]: def backtrack(target, index, path, res): if sum(path) == target: re原创 2021-03-29 10:48:23 · 80 阅读 · 0 评论 -
剑指 Offer 39. 数组中出现次数超过一半的数字
剑指 Offer 39. 数组中出现次数超过一半的数字1.题目2.我的解决方案超过一半一定在中间会出现class Solution: def majorityElement(self, nums: List[int]) -> int: nums.sort() return nums[(len(nums)-1)//2]时间复杂度:O(logn)O(logn)O(logn)空间复杂度:O(1)O(1)O(1)...原创 2021-03-28 15:29:50 · 52 阅读 · 0 评论 -
剑指 Offer 25. 合并两个排序的链表
剑指 Offer 25. 合并两个排序的链表1.题目2.我的解决方案# Definition for singly-linked list.# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solution: def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListN原创 2021-03-28 15:13:22 · 67 阅读 · 0 评论 -
剑指 Offer 64. 求1+2+…+n
剑指 Offer 64. 求1+2+…+n1.题目2.我的解决方案添加了限制之后还真有点想不出来使用递归就是很聪明的方法class Solution: def sumNums(self, n: int) -> int: # 使用递归 if n == 0: return 0 return n + self.sumNums(n-1)时间复杂度:O(n)O(n)O(n)空间复杂度:O(n)O(n)O(n原创 2021-03-28 14:26:47 · 129 阅读 · 0 评论 -
剑指 Offer 24. 反转链表
剑指 Offer 24. 反转链表1.题目2.我的解决方案# Definition for singly-linked list.# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solution: def reverseList(self, head: ListNode) -> ListNode: # 使用双指原创 2021-03-28 10:58:44 · 66 阅读 · 0 评论 -
剑指 Offer 54. 二叉搜索树的第k大节点
剑指 Offer 54. 二叉搜索树的第k大节点1.题目2.我的解决方案# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution: def kthLargest(self, root: TreeNo原创 2021-03-28 10:40:52 · 82 阅读 · 0 评论 -
剑指 Offer 22. 链表中倒数第k个节点
剑指 Offer 22. 链表中倒数第k个节点1.题目2.我的解决方案# Definition for singly-linked list.# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solution: def getKthFromEnd(self, head: ListNode, k: int) -> ListNode原创 2021-03-28 10:20:11 · 67 阅读 · 0 评论 -
剑指 Offer 27. 二叉树的镜像
剑指 Offer 27. 二叉树的镜像1.题目2.我的解决方案使用递归法# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution: def mirrorTree(self, root: Tre原创 2021-03-28 10:10:06 · 89 阅读 · 0 评论 -
剑指 Offer 15. 二进制中1的个数
剑指 Offer 15. 二进制中1的个数1.题目2.我的解决方案直接使用公式法class Solution: def hammingWeight(self, n: int) -> int: res = 0 while n > 0: n &= n-1 res += 1 return res时间复杂度:O(k)O(k)O(k)空间复杂度:O(1)O(1)O(1)原创 2021-03-27 17:29:50 · 70 阅读 · 0 评论 -
剑指 Offer 11. 旋转数组的最小数字
剑指 Offer 11. 旋转数组的最小数字1.题目2.我的解决方案题目含义就是查找最小数class Solution: def minArray(self, numbers: List[int]) -> int: return min(numbers)时间复杂度:O(logn)O(logn)O(logn)空间复杂度:O(1)O(1)O(1)3.官方的解决方案官方使用二分查找法时间复杂度:O(logn)O(logn)O(logn)空间复杂度:原创 2021-03-27 17:24:00 · 72 阅读 · 0 评论 -
剑指 Offer 10- II. 青蛙跳台阶问题
剑指 Offer 10- II. 青蛙跳台阶问题1.题目2.我的解决方案学习菲波那契数列最简单的python写法class Solution: def numWays(self, n: int) -> int: a, b = 1, 1 for i in range(n): a, b = b, a+b return a % 1000000007时间复杂度:O(n)O(n)O(n)空间复杂度:O(1)O(原创 2021-03-27 17:13:12 · 57 阅读 · 0 评论 -
剑指 Offer 10- I. 斐波那契数列
剑指 Offer 10- I. 斐波那契数列1.题目2.我的解决方案这个题应该一遍通过,但是并没有认真读题最后的那个大数如果用科学计数法表示会有误差,导致结果不正确,直接用原值class Solution: def fib(self, n: int) -> int: if n == 1 or n == 2: return 1 pre = 1 cur = 1 res = 0原创 2021-03-27 17:01:15 · 58 阅读 · 0 评论 -
剑指 Offer 09. 用两个栈实现队列
剑指 Offer 09. 用两个栈实现队列1.题目2.我的解决方案class CQueue: def __init__(self): self.stack_1 = list() self.stack_2 = list() def appendTail(self, value: int) -> None: self.stack_1.append(value) # 入栈,注意是单个数字 self.stack_原创 2021-03-27 16:11:40 · 48 阅读 · 0 评论 -
剑指 Offer 06. 从尾到头打印链表
剑指 Offer 06. 从尾到头打印链表1.题目2.我的解决方案用列表模拟一个栈# Definition for singly-linked list.# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solution: def reversePrint(self, head: ListNode) -> List[int原创 2021-03-27 15:41:35 · 46 阅读 · 0 评论 -
剑指 Offer 05. 替换空格
剑指 Offer 05. 替换空格1.题目2.我的解决方案直接利用内置函数这个函数是返回新的对象,所以需要定义变量来接class Solution: def replaceSpace(self, s: str) -> str: return s.replace(' ', '%20')时间复杂度:O(n)O(n)O(n)空间复杂度:O(1)O(1)O(1)...原创 2021-03-27 15:35:16 · 60 阅读 · 0 评论 -
剑指 Offer 04. 二维数组中的查找
剑指 Offer 04. 二维数组中的查找1.题目2.我的解决方案思路比较混乱,没有想出合适的解决办法时间复杂度:O(n)O(n)O(n)空间复杂度:O(n)O(n)O(n)3.官方的解决方案class Solution: def findNumberIn2DArray(self, matrix: List[List[int]], target: int) -> bool: # 从右上角开始查找 # target > 当前值:从列开始找原创 2021-03-27 15:25:01 · 70 阅读 · 0 评论 -
剑指 Offer 03. 数组中重复的数字
剑指 Offer 03. 数组中重复的数字1.题目2.我的解决方案三种超时的解决方案:我很无语应该是count函数的问题,有时候使用内置函数偷懒并不是一件好事 # 超时 # for num in nums: # if nums.count(num) > 1: # return num # 采用从两边搜索的策略 # 超时 # i = 0原创 2021-03-27 14:24:16 · 83 阅读 · 0 评论 -
剑指 Offer 17. 打印从1到最大的n位数
剑指 Offer 17. 打印从1到最大的n位数1.题目2.我的解决方案class Solution: def printNumbers(self, n: int) -> List[int]: res = list() for i in range(1, 10**n): res.append(i) return res时间复杂度:O(n)O(n)O(n)空间复杂度:O(1)O(1)O(1)3.官方的解决原创 2021-03-26 15:59:03 · 95 阅读 · 1 评论 -
剑指 Offer 58 - II. 左旋转字符串
剑指 Offer 58 - II. 左旋转字符串1.题目2.我的解决方案最早想出来的办法class Solution: def reverseLeftWords(self, s: str, n: int) -> str: for i in range(n): ch = s[0] s = s[1:] s += ch return s时间复杂度:O(n)O(n)O(n)空间复杂原创 2021-03-22 10:18:07 · 88 阅读 · 0 评论