Python-algorithm

索引

1. 核心数据类型

1.1. 整数 (int)

x = 10, y = -5

1.2. 浮点数 (float)

pi = 3.14

1.3. 布尔值 (bool)

flag = True, flag = False

1.4. 字符串 (str)

s = “hello world”

a, b = b, a 交换变量

2. 核心数据结构

2.1. 列表 (List)

2.1.1. 创建

1
2
3
nums = [1, 2, 3, 4] 

ans = []

2.1.2. 访问

1
2
3
first = nums[0# 正向索引,从0开始

last = nums[-1# 反向索引,从-1开始

2.1.3. 切片

创建子列表,语法 [start:stop:step]

1
2
3
4
copy = nums[:] # 创建列表浅拷贝

reverse = nums[::-1] # 翻转列表

2.1.4. 列表的常用函数和操作

1
2
3
4
5
len(nums)          # 获取长度
sum(nums) # 对数字列表求和
min(nums) / max(nums) # 求最值
sorted(nums) # 返回一个排好序的新列表
value in nums # 成员检查 (O(n))

2.1.5. 列表的常用方法

1
2
3
4
5
nums.append(value)   # 在末尾添加
nums.pop(index) # 删除并返回元素
nums.sort() # 原地排序
nums.reverse() # 原地反转
nums.index(value) # 查找索引

2.2. 字典 (Dictionary / Hash Map)

字典是无序的键值对 (key: value) 集合。它通过哈希表实现,查找、插入、删除的平均时间复杂度为 O(1)

2.2.1. 创建

1
2
lookup = {'name': 'Alice', 'id': 123}
empty_dict = {}

2.2.2. 操作

1
2
3
4
5
6
7
8
9
10
11
12
name = lookup['name'] # 不存在会报错
lookup['id'] = 456 # 添加新的键值对

'id' in lookup # 检查键是否存在

del lookup['id'] # 删除键值对

for key in lookup.keys() # 遍历所有键

for value in lookup.values() # 遍历所有值

for key, value in lookup.items() # 同时遍历键和值

2.3. 集合 (Set)

集合是无序、不重复的元素集合。其底层也是哈希表,因此检查一个元素是否存在的速度极快 (O(1))

2.3.1. 创建

1
2
3
4
unique_nums = {1, 2, 3}
empty_set = set() # 不可以使用{}

from_list = set([1, 2, 2, 3, 1]) # -> {1, 2, 3} (天然去重)

2.3.2. 操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
unique_nums.add(4) # 添加元素
unique_nums.remove(3) # 删除元素

3 in unique_nums # 检查成员是否存在

set1 = {1, 2, 3}
set2 = {3, 4, 5}

# 交集 (intersection) - 两个集合中都有的元素
intersection = set1 & set2 # -> {3}

# 并集 (union) - 两个集合中所有的元素
union = set1 | set2 # -> {1, 2, 3, 4, 5}

# 差集 (difference) - 在 set1 中但不在 set2 中的元素
difference = set1 - set2 # -> {1, 2}

2.4. 字符串 (String)

不可变的文本序列

2.4.1. 操作

切片和索引列表完全相同

1
2
3
4
5
6
new_str = str1 + str2

' '.join(['111', '222', '333']) # -> "111 222 333" (将列表连接成字符串)

"a,b,c".split(','# -> ['a', 'b', 'c'] (将字符串分割成列表)

3. 控制流与逻辑

3.1. 条件判断 (if/elif/else)

1
2
3
4
5
6
if score > 90:
grade = 'A'
elif score > 80:
grade = 'B'
else:
grade = 'C'

三元运算符 (Ternary Operator): result = “Even” if num % 2 == 0 else “Odd”

3.2. 循环

3.2.1. for循环

1
2
3
4
5
6
7
8
9
10
for num in numbers:
print(num)

# 使用 range() 进行固定次数的循环
for i in range(5): # 循环 0, 1, 2, 3, 4
print(i)

# 使用 enumerate
for index, value in enumerate(numbers):
print(f"Index: {index}, Value: {value}")

3.2.2. while 循环

1
2
3
4
count = 5
while count > 0:
print(count)
count -= 1

3.3. 函数

1
2
3
4
5
6
7
8
9
def solve(parameter1, parameter2):
# 1. 初始化变量
result = 0

# 2. 核心逻辑
# ... (使用循环、判断等)

# 3. 返回结果
return result

4. 通用内置函数

4.1. len(obj)

1
2
3
length = len([1, 5, 9])      # -> 3
str_len = len("hello") # -> 5
dict_len = len({'a': 1, 'b': 2}) # -> 2

4.2. sum(iterable)

1
2
# 适用于数字组成的列表、元组等
total = sum([10, 20, 30]) # -> 60

4.3. min(iterable) / max(iterable)

1
2
3
4
# 适用于可比较元素组成的序列
min_val = min([3, 1, 9, 2]) # -> 1
max_val = max([3, 1, 9, 2]) # -> 9
min_char = min("database") # -> 'a' (按字母序)

4.4. sorted(iterable)

1
2
3
4
5
6
7
# 返回一个全新的排好序的列表,不改变原对象
nums = [3, 1, 4, 2]
new_sorted_list = sorted(nums) # -> [1, 2, 3, 4]
# print(nums) 仍然是 [3, 1, 4, 2]

# 对字符串排序会得到字符列表
sorted_chars = sorted("bca") # -> ['a', 'b', 'c']

4.5. abs(x)

1
num = abs(-5) # 5

4.6. range(start, stop, step)

1
2
3
4
5
6
7
8
9
10
11
# range(stop)
for i in range(3):
print(i) # -> 依次输出 0, 1, 2

# range(start, stop)
for i in range(1, 4):
print(i) # -> 依次输出 1, 2, 3

# range(start, stop, step)
for i in range(0, 5, 2):
print(i) # -> 依次输出 0, 2, 4

4.7. 类型转换函数

4.7.1. int(x)

1
a=int("123") # -> 123 

4.7.2. str(obj)

1
a=str(123# -> "123"

4.7.3. list(iterable)

1
ans=list(range(3)) # -> [0, 1, 2]

4.7.4. set(iterable)

1
new_set=set([1, 2, 2, 3]) # -> {1, 2, 3}

4.8. enumerate(iterable)

1
2
3
4
5
6
7
# 在循环中同时需要下标和元素的最佳方式
letters = ['a', 'b', 'c']
for index, value in enumerate(letters):
print(f"Index: {index}, Value: {value}")
# -> Index: 0, Value: a
# -> Index: 1, Value: b
# -> Index: 2, Value: c

4.9. zip()

1
2
3
4
5
6
7
# 将多个列表/元组等并行打包遍历
names = ['Alice', 'Bob']
scores = [95, 88]
for name, score in zip(names, scores):
print(f"{name}: {score}")
# -> Alice: 95
# -> Bob: 88

4.10. map(function, iterable)

1
2
3
4
5
6
7
8
# 将函数应用于序列的每个元素,返回一个迭代器
str_nums = ["1", "2", "3"]
# 需要用 list() 来获取所有结果
int_nums = list(map(int, str_nums)) # -> [1, 2, 3]


line = "10 20 30"
nums = list(map(int, line.split())) # -> [10, 20, 30]

5. 核心数据类型方法

5.1. 字符串 (str)

5.1.1. str.split(sep)

1
2
3
4
5
s = "hello world"
words = s.split(' ') # -> ['hello', 'world']

csv = "a,b,c"
items = csv.split(',') # -> ['a', 'b', 'c']

5.1.2. sep.join(list)

1
2
3
4
5
words = ['hello', 'world']
s = " ".join(words) # -> "hello world"

chars = ['p', 'y']
result = "-".join(chars) # -> "p-y"

5.1.3. str.find(sub)

1
2
3
4
s = "banana"
# 找不到时返回 -1
index1 = s.find('na') # -> 2 (首次出现的位置)
index2 = s.find('z') # -> -1

5.1.4. str.count(sub)

1
2
s = "banana"
count = s.count('a') # -> 3

5.1.5. str.strip()

1
2
s = "  hello  "
clean_s = s.strip() # -> "hello"

5.1.6. str.isdigit()

1
2
3
4
s1 = "123"
s2 = "a123"
print(s1.isdigit()) # -> True
print(s2.isdigit()) # -> False

5.2. 列表 (list)

5.2.1. list.index(x[, start[, end]])

1
2
3
4
aList = [123'xyz''runoob''abc']  

index1 = aList.index( 'xyz' ) # 1
index2 = aList.index( 'runoob'13 ) # 2

5.2.2. list.append(x)

1
2
nums = [1, 2]
nums.append(3) # nums 变为 [1, 2, 3]

5.2.3. list.pop(i)

时间复杂度为O(n),list模拟队列效率很低

1
2
3
4
nums = [10, 20, 30]
last = nums.pop() # -> 30, nums 变为 [10, 20]
# 删除并返回指定索引的元素
first = nums.pop(0) # -> 10, nums 变为 [20]

5.2.4. list.sort(cmp=None, key=None, reverse=False)

1
2
3
4
5
6
7
8
9
10
11
12
13
nums = [3, 1, 4, 2]
nums.sort() # nums 本身变为 [1, 2, 3, 4]

# 降序排序
nums.sort(reverse=True) # nums 变为 [4, 3, 2, 1]

# 获取列表的第二个元素
def takeSecond(elem):
return elem[1]
random = [(2, 2), (3, 4), (4, 1), (1, 3)]
# 指定第二个元素排序
random.sort(key=takeSecond) # 排序列表: [(4, 1), (2, 2), (1, 3), (3, 4)]

5.2.5. list.reverse()

1
2
nums = [1, 2, 3]
nums.reverse() # nums 变为 [3, 2, 1]

5.2.6. list.remove(obj)

删掉第一个匹配的

1
2
3
list1 = ['Google''Runoob''Taobao''Baidu']  
list1.remove('Taobao') # ['Google', 'Runoob', 'Baidu']
list1.remove('Baidu') # ['Google', 'Runoob']

5.3. 字典 (dict)

5.3.1. dict.get(key, default)

1
2
3
4
5
counts = {'a': 2, 'b': 1}
# 获取键 'b' 的值
val1 = counts.get('b', 0) # -> 1
# 获取键 'c' 的值,因不存在,返回默认值 0
val2 = counts.get('c', 0) # -> 0

5.3.2. dict.keys()

1
2
3
4
5
counts = {'a': 2, 'b': 1}
for key in counts.keys():
print(key) # -> 依次输出 'a', 'b'

sorted_keys = sorted(counts.keys()) # -> ['a', 'b']

5.3.3. dict.values()

1
2
3
4
5
counts = {'a': 2, 'b': 1}
for value in counts.values():
print(value) # -> 依次输出 2, 1

values_list = list(counts.values()) # -> [2, 1]

5.3.4. dict.items()

1
2
3
4
5
counts = {'a': 2, 'b': 1}
for key, value in counts.items():
print(f"{key}: {value}")
# -> a: 2
# -> b: 1

6. Collections

defaultdict

使用dict时,如果引用的Key不存在,就会抛出KeyError。如果希望key不存在时,返回一个默认值,就可以用defaultdict

1
dd = defaultdict(lambda: 'N/A')

使用lambda 可创建默认值
否则的话默认是0

这边还在等待更新中
其实是刷题刷着刷着觉得应该开始总结经验还有防止忘记