博主很久以前有C++的经验,但感觉以后工作接触不到C++,遂决定摆烂放弃C++直接用Python刷Leetcode^_^
数据结构
基础数据类型
Python中,均为左闭右开结构,刷力扣时如发现output与answer差一位,可以尝试检查index是否考虑左闭右开。
a = 1 # 整型
b = 2.2 # 浮点型
c = "String" # 字符串类型
d = 'char' # 字符串类型
e = False # 布尔值
f = True # 布尔值
字符串:不可变数据类型
a = "Hello World"
a = a[x:y:z] # 切片操作, index[x,y)截取出来,步长为z
a = a.replace("World", "C++") # 替换操作
arr = a.split(" ") # 根据" "来切分, arr为一个列表
# ["Hello", "World"]
string = "-".join(arr) # 拼接操作, 用"-"来拼接每一个元素
# "Hello-World"
四种复合数据类型
a = [1, 3, 5] # 列表
c = (1, 3, 5) # 元组
b = {1, 3, 5} # 集合
d = {'n': 1, 'b': 2} # 字典
列表:列表是有序的,且中的元素可以为不同类型,index与C一样从0开始。
b = 12
a = [1, False, "Happy", b, [1, 2, 3]]
c = b[4][0]
if 1 in a:
print("找到1在a中")
"""
创建列表
"""
array_2d = [[0 for _ in range(cols)] for _ in range(rows)] # 二维列表
"""
插入列表元素
"""
a.append("abc") # 末尾添加元素
a.insert(2,'t') # 在index[2]插入元素
"""
删除列表元素
"""
a.pop(2) # 删除index[2]的元素
a.remove(b)
a.clear
del a
"""
复制列表
"""
list2 = list1.copy() # 复制列表
list2 = list1 # 相当于C中的双指针指向同一地址, 元素更改是同步的
"""
列表排序
"""
a.sort() # 无return
b = sorted(a) # 有return
元组:与列表不同,元组是只读的、不可修改的,index同样从0开始。
a = [1, 2, "qwer", 4, 5]
"""
遍历元组
"""
for i in a:
print(i)
for i in range(len(a)):
print(a[i])
集合:无序性、不重复性
ls = set() # 空集合
str = {1, 3, 3, 4}
print(str) # {1, 3, 4} 自动去除相同元素, 内部在逻辑上是无序的
"""
集合插入元素
"""
ls.add(4) # 插入单个元素
ls.update((6, 7), {8}) # 混合插入元组和集合
字典:Key和Value
m = {} # 空字典
map = {"name": "哞哞牧场", "age": 18}
map.keys() # ['name', 'age']
map.values() # ['哞哞牧场', 18]
map.items() # [('name', '哞哞牧场'), ('age', 20)]
"""
修改字典
"""
map["age"] = 100
"""
遍历字典
"""
for k, v in map.items():
print(k)
print(v)
"""
删除字典
"""
del map["age"]
map.clear
del map
"""
子集判断
"""
if dict_A <= dict_B:
print("A是B的子集")
特殊数据类型
队列:collections.deque() 是 Python 标准库中的双端队列(Double-Ended Queue),支持高效的从两端添加和删除元素
from collections import deque
# 创建一个双端队列
dq = deque()
# 添加元素
dq.append(1) # 在右侧添加元素
dq.append(2)
dq.appendleft(0) # 在左侧添加元素
# 访问元素
print(dq[0]) # 访问第一个元素
print(dq[-1]) # 访问最后一个元素
# 移除元素
dq.pop():移除并返回队列右侧的元素。
dq.popleft():移除并返回队列左侧的元素。
print(dq.popleft()) # 输出 0
print(dq.pop()) # 输出 2
简单语句
print语句
num = 22
print("Hello World")
print(f"hello {num}") # f:格式化输出
input语句
a = input()
b = input("请输入: ")
c = int(input("请输入: ")) # 强制类型转换
random语句
import random
a = random.randint(1, 100)
b = random.uniform(1, 100)
c = random.random()
print(a, b, c)
运算法则
a = b + c
a = b - c
a = b / c
a = b // c # 整除运算
a = b % c # 求余数
a = b * c
a = b ** c # b的c次方
str1 = "O"
str2 = "P"
str = str1 + str2 # OP
str = str1 + str2 * 3 # OPPP
条件和循环
条件if语句
a = 1
b = 2
if a < b:
print("小孩")
elif a > b:
print("大孩")
else:
print("中孩")
while和for循环语句
a = 0
while a < 10:
a++
if a == 5:
continue # break
print(a)
for i in range(10): # range()函数用于生成一个迭代器; range(a, b)可以约定范围
print(i)
str = "ABCDEF"
for i in str:
print(i) # ABCDEF
函数def function
def my_function(参数a, 参数b):
xxx
xxx
def func():
return 1, 2
a = func() # a为元组(1, 2)
a, b = func() # 拆包操作
"""
不定长参数: 表示参数量不确定,可能有无穷多个,
*args:包裹位置参数, 只需要写一个值即可
**kwargs: 包裹关键字参数, 需要写关键字及值 ns = 1
"""
def fun(n, age=18, *args, **kwargs):
xxx
xxx
fun(1, 196, 2, 3, 4, ns=10, nt=100)
# n = 1; age = 18; arge = (196, 2, 3, 4); kwargs = {"ns": 10, "nt": 100}
一些常见算法用函数(LeetCode Hot 100)
defaultdict()函数:
- 创建一个默认值为空列表(list), 空集合(set), 空值(int) 的字典
- 在访问不存在的键时,会自动创建该键并用指定的默认工厂函数初始化值
d = {}
d['key'].append(1) # 报错 KeyError,因为'key'不存在
from collections import defaultdict
d = defaultdict(list)
d['key'].append(1) # 自动创建 'key': [1]
enumerate()函数:
- 用于在遍历一个可迭代对象(如列表、元组、字符串等)时,同时获取元素的索引和值
- 它返回一个枚举对象 ,其中每个元素是一个包含索引和对应值的元组
fruits = ['apple', 'banana', 'cherry']
for index, value in enumerate(fruits):
print(f"Index: {index}, Value: {value}")
ord()函数:
- 用来返回单个字符的ascii值(0-255)或者unicode数值
>>> ord('d')
100
>>> ord('5')
53
Counter()函数:
- 用于统计可迭代对象中元素的出现次数,返回的是一个类似字典(dict-like)的对象
s = "abacab"
cnt_s = Counter(s)
print(cnt_s) # 输出: Counter({'a': 3, 'b': 2, 'c': 1})