蓝桥杯python知识总结(详细)
文章目录
- python接收数据的方法
- python内置方法
- python字符串方法
- python模块
- 动态规划
- 回溯算法
- 力扣简单题中所含知识点(前面数字为题号)
- 力扣一些有意思的题目
python接收数据的方法
1、接收一个元素 s = input() #字符串 n = int(input()) #整数 2、接收两个或三个元素(以空格隔开) n, m = map(int, input().split()) n, m, k = map(int, input().split()) 3、将一行元素放入数组中 num = [int(i) for i in input().split()] 4、将数组变为整个字符串 s= "".join(map(str,num))
python内置方法
hex() 将数字转换为十六进制字符串 oct() 将整数转换成八进制字符串 oct(int("39",16)) >>>'0o71' 十六进制转八进制 chr(number) 返回数字对应的ascii码值 divmod(a,b) 返回(a//b,a%b)
python字符串方法
s.swapcase() 将字符串中所有字母的大小写都反转 s.upper() 将字符串所有的字母都转换为大写 s.lower() 将字符串所有的字母都转换为小写 s.isdigit() 检查字符串中的字符是否都是数字 s.isnumeric() 检查字符串中的所有字符是否都是数字字符 s.capitalize() 返回字符串的副本,但将第一个字符大写 s.isalpha() 检查字符串中的所有字符是否都是字母 s.isalnum() 检查字符串中的字符是否都是字母或数 s.isspace() 检查字符串中的字符是否都是空白字符
python模块
statistics模块
(图片来源网络,侵删)1、statistics.mean() 求算术平均值 2、statistics.median() 计算数据的中位数,如果有两个中位数,则返回其平均值 statistics.median_low() 数据中的低中位数 statistics.median_high() 数据中的高中位数 3、statistics.mode() 计算众数 4、statistics.pvariance() 计算数据的总体方差
collections模块
1、collections.deque([]) q = collections.deque([1, 2, 3, 4]) q.rotate(1) print(q) # [4, 1, 2, 3] q.rotate(1) print(q) # [3, 4, 1, 2] 2、collections.Counter() >>> import collections >>> collections.Counter([1,2,3,1,2,3,1,2]) Counter({1: 3, 2: 3, 3: 2})
datetime模块
1、日期增加 >>> import datetime >>> bt = datetime.date(2000,11,6) >>> print(bt) 2000-11-06 >>> a = datetime.timedelta(days=100) >>> a datetime.timedelta(days=100) #weeks / hours >>> b = a + bt >>> b datetime.date(2001, 2, 14)
2、给定日期求星期
bt.weekday():返回weekday,如果是星期一,返回0;如果是星期2,返回1,以此类推; bt.isoweekday():返回weekday,如果是星期一,返回1;如果是星期2,返回2,以此类推;
3、标准化
>>> bt.isoformat() '2000-11-06'
4、返回公元公历开始到现在的天数
>>> bt.toordinal() 730430
5、输出
>>> bt.__format__('%Y/%m/%d') '2000/11/06'
calendar模块
1、判断是否为闰年 >>> import calendar >>> calendar.isleap(2022) False 2、返回两年之间的闰年总数 >>> calendar.leapdays(2000,2020)
动态规划
大致解法
1、定义数组元素的含义,清楚dp[i]的含义,表示的结果
2、找出数组元素之间的关系式,即动态转移方程,递推公式
3、找出初始值,例如第一个元素值
回溯算法
框架
ans = [] def trace(path,choices): if len(path) == len(nums): ans.append(list(path)) for i in choices: if i in path: continue path.append(i) trace(path,choices) path.pop() return ans nums = [1,2,3] print(trace([],nums)) >>> [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]
res = [] path = [] def bt(nums,startIndex): res.append(path[:]) for i in range(startIndex,len(nums)): path.append(nums[i]) bt(nums,i+1) path.pop() nums = [1,2,3] bt(nums,0) print(res) >>> [[], [1], [1, 2], [1, 2, 3], [1, 3], [2], [2, 3], [3]]
#9 字符串、列表反转
s = "123456" s[::-1] >>>"654321"
回溯算法例题 # 17 39 40 46 47 77 78 90 1079
力扣简单题中所含知识点(前面数字为题号)
#14 enumerate() 函数
用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。 max()和min(),字符串是可以比较的,按照ascII值排 abb, aba,abac,最大为abb,最小为aba
zip函数
a = [1,2,3] b = [4,5,6] list(zip(a,b)) >>>[(1,4),(2,5),(3,6)] strs = ["flower","flow","flight"] list(zip(*strs))
#17 #46 #47 itertools模块
import itertools 1)product for i in itertools.product('ab', 'cd'): print(i) >>>('a', 'c') ('a', 'd') ('b', 'c') ('b', 'd') 2)permutations list(itertools.permutations('ABC')) >>>[('A', 'B', 'C'), ('A', 'C', 'B'), ('B', 'A', 'C'), ('B', 'C', 'A'), ('C', 'A', 'B'), ('C', 'B', 'A')] list(itertools.permutations('ABC', 2)) >>>[('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'C'), ('C', 'A'), ('C', 'B')] 3)combinations list(itertools.combinations("ABC",2)) >>>[('A', 'B'), ('A', 'C'), ('B', 'C')] 4)accumulate 可指定函数,默认为求和 list(itertools.accumulate([0,1,0,1,1,2,3,5])) >>>[0, 1, 1, 2, 3, 5, 8, 13] list(itertools.accumulate([0,1,0,1,1,2,3,5],max)) >>>[0, 1, 1, 1, 1, 2, 3, 5]
#20 寻找元素时,可以考虑替换字符串元素
.replace(“()”,“”)
#27 删除某一元素时,可以while ture 用remove
remove删除列表第一个为指定值的元素
#28 find在字符串中查找子串,如果找到,返回字串的第一个字符的索引,找不到返回-1
a = “asdfghjkl” b = “jkl”
KMP算法
#49 字母异位词分组
字典的用法
strs = ["eat", "tea", "tan", "ate", "nat", "bat"] res = [] dic = {} for s in strs: keys = "".join(sorted(s)) if keys not in dic: dic[keys] = [s] else: dic[keys].append(s) print(list(dic.values())) >>>[['eat', 'tea', 'ate'], ['tan', 'nat'], ['bat']]
#50 幂函数
.pow(a,b)
#58 按照指定字符将字符串拆分成序列 s.split(" ")
将字符串开头和末尾的空白删除,返回删除后的结果 s.strip()
#64 创建二维列表方法
dp = [[0 for _ in range(n)] for j in range(m)] dp = [[0] * n for i in range(m)]
#67 二进制转十进制 int(“二进制字符串”,2)
十进制转二进制 bin(整数)[2:]
#88 删除列表最后一个元素
list.pop()
#136 只出现一次的数字用异或运算
a = 0 for i in nums: a = a^i
#191 二进制
bin() 返回一个整数 int 或者长整数 long int 的二进制表示。
#231 2的幂次方的二进制数,只有一位为一
#268 进行数组加减或者删除重复的元素
set() 函数创建一个无序不重复元素集,可进行关系测试,删除重复数据
#367 不用库求完全平方数
1、完全平方数是前n个连续奇数的和 1+3+5+7+9+…+(2n-1)=n^2 2、n ** 0.5 % 1
#500 set函数可以进行比较
a = set('qwertyuiop') b = set("reagdagd") return bv:k for k,v in d.items()} 寻找键 for i in d: if ans[i] == a: l.append(i)
p#605 考虑边界问题时,可在数组前后各加入一个数/p p#645 找连续数组中不同元素时,可以用求和找/p p#709 字符串所有的字母都转换为小写/pps.lower()/p p#914 求数组中所有数的公因数/p pre class="brush:python;toolbar:false" while len(ans) != 1: ans = sorted(ans) c = math.gcd(ans[0],ans[1]) if c == 1: print("1") else: ans.append(c) ans.remove(ans[0]) ans.remove(ans[0]) print(ans[0]) /pre p#922 将两个列表交叉合并/p pre class="brush:python;toolbar:false"from itertools import chain list(chain.from_iterable(zip(a, ans))) [i for n in zip(a, ans) for i in n] /pre p#1154 日期确定是当年的第几天/p pre class="brush:python;toolbar:false"time.strptime(date, "%Y-%m-%d")[-2] /pre p#1185 日期确定星期/p pre class="brush:python;toolbar:false"datetime.datetime(year,month,day).strftime("%w") /pre p#1207 求数组中所有元素出现的个数/p pre class="brush:python;toolbar:false"from collections import Counter arr = [1,2,2,1,1,3] print(Counter(arr).values()) >>>dict_values([3, 2, 1])from collections import Counter arr = [1,2,2,1,1,3] print(Counter(arr)) >>>Counter({1: 3, 2: 2, 3: 1})
#1232 直线斜率不要用除法,除数可能为0,转用乘法
y2 / y1 == x2 / x1
x1 * y2 == x2 * y1
#1304 列表生成器
[i for i in range(1,n)]
#1323 replace将指定字符串替换为另一个字符串
str.replace(指定字符,目标字符,不超过的次数)
#1331 可以利用enumerate创建字典后,根据元素找下标
a = sorted(set(arr)) d = {} for i, v in enumerate(a, 1): d[v] = i
#1337 字典根据值的大小进行排序
d = sorted(d.items(), key=lambda item:item[1])
#1342 不知道循环次数时用while
#1346 判断列表是否为空
len() 注意特殊的0,二倍还是为0
#1365 找比指定的数小或者大的数 ,可以先进行排序,再通过索引的值获得有多少个这种数
#1380 矩阵中的幸运数
获取二维数组每列元素
matrix = [[3,7,8],[9,11,13],[15,16,17]] colmin = [i for i in zip(*matrix)] >>>[(3, 9, 15), (7, 11, 16), (8, 13, 17)]
#1556 千位分隔符
print({:,}.format(n).replace(",",".")) n = 123456 >>>123.456
#1608 bisect.bisect_left(list , i) 查找该数值将会插入的位置并返回
#1624 字符串.rfind() 查找字符最后一次出现的位置,没有则返回-1
#1710 按照某种规律进行排序
l = [[5,10],[2,5],[4,7],[3,9]] l = sorted(l, key=lambda x:-x[1]) >>>[[5, 10], [3, 9], [4, 7], [2, 5]]
l = ["adss","a","sad","sd"] l = sorted(l,key=lambda x:len(x)) >>>['a', 'sd', 'sad', 'adss']
#1863 找出给定列表的所有子集
l = [[]] for x in nums: l.extend([i + [x] for i in l])
对序列中的元素进行累计 eg:求所有元素的异或总和
from functools import reduce j = [1,2,3,4,5] reduce(lambda x,y:x ^ y,j)
#1880 返回单个字母的特定值,可以先返回其Unicode码
ord("a") >>>97
#1979 求a和b最大公约数
gcd(a,b)
#5947 返回一个新集合,该集合的元素既包含在集合 x 又包含在集合 y 中
x.intersection(y)
力扣一些有意思的题目
偏数学归纳题:#6 z字形变换 #441 排列硬币 #1518 换酒问题
#258 各位相加 https://leetcode-cn.com/problems/add-digits/
思路惊奇:#645 错误的集合 https://leetcode-cn.com/problems/set-mismatch/
#461 汉明距离 https://leetcode-cn.com/problems/hamming-distance/(异或运算)
#246 中心对称数 https://leetcode-cn.com/problems/strobogrammatic-number/
#838 推多米诺 https://leetcode-cn.com/problems/push-dominoes/ (元素替换)
#453 最小操作次数使数组元素相等 https://leetcode-cn.com/problems/minimum-moves-to-equal-array-elements/
#1002 查找共用字符 https://leetcode-cn.com/problems/find-common-characters/
#657 机器人能否返回原点 https://leetcode-cn.com/problems/robot-return-to-origin/
#2124 检查是否所有 A 都在 B 之前 https://leetcode-cn.com/problems/check-if-all-as-appears-before-all-bs/
#908 最小差值 I https://leetcode-cn.com/problems/smallest-range-i/
#343 整数拆分 https://leetcode-cn.com/problems/integer-break/
lambda表达式用法:#1287 #1122 #1710 #1337
记住最直接的思路:
#5957 向字符串添加空格 https://leetcode-cn.com/problems/adding-spaces-to-a-string/
#1935 可以输入的最大单词数 https://leetcode-cn.com/problems/maximum-number-of-words-you-can-type/
#283 移动零 https://leetcode-cn.com/problems/move-zeroes/
#169 多数元素 https://leetcode-cn.com/problems/majority-element/
#459 重复的子字符串 https://leetcode-cn.com/problems/repeated-substring-pattern/
#2006 差的绝对值为 K 的数对数目 https://leetcode-cn.com/problems/count-number-of-pairs-with-absolute-difference-k/