- 博客(13)
- 收藏
- 关注
原创 with用法
with语句经常适用于对资源进行访问的场合,确保在访问的过程中不管是否发生异常都会指执行必要的清理操作,比如文件的自动关闭以及线程中锁的自动获取与释放。with的实现机制是:with对象应该具有一个 __enter__() 方法和一个 __exit__() 方法。with语句将首先调用对象的 __enter__() 方法,并将 __enter__() 方法的返回值赋值给as后面的变量。当with后面的代码块全部被执行完之后,with将调用象的 __exit__() 方法。例:class Samp
2020-08-29 20:45:32
410
原创 装饰器
装饰器本质上是一个 Python 函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。有了装饰器,就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。装饰器的核心内容其实就是将函数作为参数传递给另一个函数。1. 无参数装饰器def logging(func): def wrapper(*args, **kwargs): print("%s is
2020-08-29 20:44:55
80
原创 动态规划
0. 动态规划动态规划 (Dynamic Programming) 问题的一般形式就是求最值,比如说让你求最长递增子序列呀,最小编辑距离呀等等。求解动态规划的核心问题是穷举,因为要求最值,肯定要把所有可行的答案穷举出来,然后在其中找最值。动态规划的思考模式:动态规划的穷举有点特别,因为这类问题存在「重叠子问题」,如果暴力穷举的话效率会极其低下,所以需要「备忘录」或者「DP table」来优化穷举过程,避免不必要的计算。动态规划问题一定会具备「最优子结构」,才能通过子问题的最值得到原问题的最值
2020-08-29 20:43:23
179
原创 数组与矩阵
1. 把数组中的0移到末尾给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。输入: [0,1,0,3,12]输出: [1,3,12,0,0]说明:必须在原数组上操作,不能拷贝额外的数组。尽量减少操作次数。将非0元素按读取顺序放在数组的前面,剩下的位置全放0。class Solution: def moveZeroes(self, nums: List[int]) -> None: """ Do not
2020-07-20 17:13:49
252
原创 字符串
1. 字符串循环移位包含s1 = AABCD, s2 = CDAAReturn : true给定两个字符串 s1 和 s2,要求判定 s2 是否能够被 s1 做循环移位得到的字符串包含。s1 进行循环移位的结果是 s1s1 的子字符串,因此只要判断 s2 是否是 s1s1 的子字符串即可。def isContainsByConcal(a, b): if not a or not b: return False new_a = a + a return b in new_a
2020-07-20 17:13:15
283
原创 哈希表
哈希表使用 O(N) 空间复杂度存储数据,并且以 O(1) 时间复杂度求解问题。1. 数组中两个数的和为给定值给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]class Solution:
2020-07-20 17:12:35
77
原创 栈和队列
1. 用栈实现队列使用栈实现队列的下列操作:push(x) -- 将一个元素放入队列的尾部。pop() -- 从队列首部移除元素。peek() -- 返回队列首部的元素。empty() -- 返回队列是否为空。class MyQueue: def __init__(self): self.s1 = [] self.s2 = [] # 添加元素到队尾 def push(self, x: int) -> None:
2020-07-20 17:11:24
81
原创 分治
1. 给表达式加括号给定一个含有数字和运算符的字符串,为表达式添加括号,改变其运算优先级以求出不同的结果。你需要给出所有可能的组合的结果。有效的运算符号包含 +, - 以及 * 。输入: "2*3-4*5"输出: [-34, -14, -10, -10, 10]解释: (2*(3-(4*5))) = -34 ((2*3)-(4*5)) = -14 ((2*(3-4))*5) = -10 (2*((3-4)*5)) = -10 (((2*3)-4)*5) = 10对于一个形如 x op
2020-07-20 17:10:43
149
原创 二分查找
0. 二分查找正常实现:Input : [1,2,3,4,5]target : 3return the index : 2def binarySearch(nums, target): l, r = 0, len(nums) - 1 while l <= h: mid = l + (r - l) // 2 if nums[mid] == target: return mid elif nums[mid]
2020-07-20 17:10:12
65
原创 贪心思想
保证每次操作都是局部最优的,并且最后得到的结果是全局最优的。1. 分配饼干每个孩子都有一个满足度 g,每个饼干都有一个大小 s,只有饼干的大小大于等于一个孩子的满足度,该孩子才会获得满足。求解最多可以获得满足的孩子数量。给一个孩子的饼干应当尽量小并且又能满足该孩子,这样大饼干才能拿来给满足度比较大的孩子。因为满足度最小的孩子最容易得到满足,所以先满足满足度最小的孩子。class Solution: def findContentChildren(self, g: List[int],
2020-07-20 17:09:31
81
原创 双指针
双指针主要用于遍历数组,两个指针指向不同的元素,从而协同完成任务。1.1 有序数组中的两数之和给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。返回的下标值(index1 和 index2)不是从零开始的。你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。输入: numbers = [2, 7, 11, 15], target = 9输出: [1,2
2020-07-20 17:08:39
796
原创 LeetCode之位运算
LeetCode中关于位运算的题目。0. 原理基本原理0s 表示一串 0,1s 表示一串 1。x ^ 0s = x x & 0s = 0 x | 0s = xx ^ 1s = ~x x & 1s = x x | 1s = 1sx ^ x = 0 x & x = x x | x = x利用 x ^ 1s = ~x 的特点,可以将一个数的位级表示翻转;利用 x ^ x = 0 的特点,可以将三个数中重复
2020-07-19 23:41:51
243
原创 链表
链表是空节点,或者有一个值和一个指向下一个链表的指针,因此很多链表问题可以用递归来处理。1. 找出两个链表的交点例如以下示例中 A 和 B 两个链表相交于 c1:A: a1 → a2 ↘ c1 → c2 → c3 ↗B: b1 → b2 → b3但是不会出现以下相交的情况,因为每个节点只有一个 next 指针,也就只能有一个后继节点,而以下示例中节点
2020-07-19 23:41:12
167
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人