当前位置: 首页 > news >正文

算法题笔记(自用)——Python

目录

一. 进制&位运算&ASCAII

二. format格式化输出

1. 基本用法

2. 位置参数

3. 格式化数字

4. 对齐和填充

5. 格式化二进制、八进制、十六进制

6. 格式化百分比

7. 格式化科学计数法

8. 格式化字符串字面量(f-string)

三. 字符串

使用 join() 方法拼接字符串列表。

使用 find() 查找子字符串的位置(返回第一个匹配的索引,未找到返回 -1)。

 使用 index() 查找子字符串的位置(未找到会抛出异常)。

使用 replace() 替换子字符串。

使用 split() 按分隔符分割字符串。

使用 upper() 转换为大写。

使用 strip() 去除两端空白。

使用 isalpha() 判断是否全为字母。

使用 isdigit() 判断是否全为数字。

使用 isalnum() 判断是否全为字母或数字。

使用 ljust() 左对齐并填充。使用 rjust() 右对齐并填充。使用 center() 居中对齐并填充。

使用 count() 统计子字符串出现的次数。

使用切片反转字符串。

使用 zfill() 在字符串左侧填充零。

四. 文件操作

1. 打开文件

2. 文件打开模式

3. 读取文件

4. 写入文件

5. 关闭文件

6. 文件指针操作

五. 集合

使用 add() 添加单个元素。

使用 update() 添加多个元素。

使用 remove() 删除指定元素(元素不存在会报错)。

使用 discard() 删除指定元素(元素不存在不会报错)。

使用 pop() 随机删除并返回一个元素。

使用 clear() 清空集合。

使用 union() 或 | 计算两个集合的并集。

使用 intersection() 或 & 计算两个集合的交集。

使用 difference() 或 - 计算两个集合的差集。

使用 symmetric_difference() 或 ^ 计算两个集合的对称差集(仅存在于一个集合中的元素)。

 使用 issubset() 或 <= 判断一个集合是否是另一个集合的子集。

 使用 < 判断一个集合是否是另一个集合的真子集。

使用 issuperset() 或 >= 判断一个集合是否是另一个集合的超集。

使用 > 判断一个集合是否是另一个集合的真超集。

使用 copy() 复制集合。

六. 库函数

bisect

itertools

collections

functools

string

sys

math

heapq

 datetime

Decimal

七. 模板

1. 二分查找:

2. 二位前缀和 & 差分

 3.快速幂

4.dijkstra

5.弗洛伊德

6.并查集

 7.树状数组

 8.素数预处理

八. 其他用法


一. 进制&位运算&ASCAII

bin(): 将整数转换为二进制字符串。

hex():将整数转换为十六进制字符串。

oct():将整数转换为八进制字符串。

int(): 将二进制字符串转换为整数。

binary_str = '1010'
num = int(binary_str, 2)  # 输出: 10

ord(): 获取字符的 ASCII 值(整数)。

chr(): 将整数(ASCII 值)转换为对应的字符。

int.bit_count() : (Python 版本: 3.10 及以上。)

num = 0b101011  # 二进制表示是 101011
count = num.bit_count()
print(count)  # 输出: 4

 int.bit_length():  返回整数二进制表示的最小位数(不包括符号位和前导零)

num = 10  # 二进制表示是 1010
length = num.bit_length()
print(length)  # 输出: 4

&: 按位与

|: 按位或

^: 按位异或

~: 按位取反

<<: 左移

>>: 右移

0xaaaaaaaa:        

二进制:10101010 10101010 10101010 10101010设计逻辑:所有奇数位为 1,偶数位为 0。用途:用于提取或检查奇数位。

0x55555555:

二进制:01010101 01010101 01010101 01010101设计逻辑:所有偶数位为 1,奇数位为 0。用途:用于提取或检查偶数位。

0xcccccccc:

二进制:11001100 11001100 11001100 11001100设计逻辑:每两位重复 11 和 00。用途:用于处理两位一组的操作。

0x33333333:

二进制:00110011 00110011 00110011 00110011设计逻辑:每两位重复 00 和 11。用途:用于处理两位一组的操作。

0xf0f0f0f0:

二进制:11110000 11110000 11110000 11110000设计逻辑:每四位重复 1111 和 0000。用途:用于处理四位一组的操作。

0x0f0f0f0f:

二进制:00001111 00001111 00001111 00001111设计逻辑:每四位重复 0000 和 1111。用途:用于处理四位一组的操作。

0x80000000:

二进制:10000000 00000000 00000000 00000000设计逻辑:最高位为 1,其余位为 0。用途:用于检查符号位(如 32 位整数的符号位)。

0x7fffffff:

二进制:01111111 11111111 11111111 11111111设计逻辑:最高位为 0,其余位为 1。用途:用于表示最大正数(如 32 位整数的最大值)。

快速判断奇偶性:if (x & 1) { /* x是奇数 */ }
快速除以2:x >>= 1(相当于x //= 2)
快速乘以2:x <<= 1(相当于x *= 2)
判断第n位是否为1:if (x & (1 << n)) { /* 第n位是1 */ }
设置第n位为1:x |= (1 << n)
将第n位清零:x &= ~(1 << n)
切换第n位的状态:x ^= (1 << n)

二. format格式化输出

1. 基本用法

format() 方法通过将占位符 {} 替换为传入的参数来格式化字符串。

text = "Hello, {}!".format("World")
print(text)  # 输出: Hello, World!

2. 位置参数

可以在 {} 中指定参数的索引(从 0 开始),以控制参数的替换顺序。

text = "{1} {0}".format("World", "Hello")
print(text)  # 输出: Hello World

3. 格式化数字

format() 支持对数字进行格式化,包括整数、浮点数等。

# 保留两位小数
pi = 3.1415926
text = "Pi: {:.2f}".format(pi)
print(text)  # 输出: Pi: 3.14# 千位分隔符
number = 1000000
text = "Number: {:,}".format(number)
print(text)  # 输出: Number: 1,000,000

4. 对齐和填充

可以通过 : 指定对齐方式和填充字符。

# 左对齐,宽度为 10,填充字符为 ' '
text = "{:<10}".format("Hello")
print(text)  # 输出: Hello# 右对齐,宽度为 10,填充字符为 '*'
text = "{:*>10}".format("Hello")
print(text)  # 输出: *****Hello# 居中对齐,宽度为 10,填充字符为 '='
text = "{:=^10}".format("Hello")
print(text)  # 输出: ==Hello===

5. 格式化二进制、八进制、十六进制

可以将数字格式化为二进制、八进制或十六进制。

num = 255# 二进制
text = "Binary: {:b}".format(num)
print(text)  # 输出: Binary: 11111111# 八进制
text = "Octal: {:o}".format(num)
print(text)  # 输出: Octal: 377# 十六进制(小写)
text = "Hex: {:x}".format(num)
print(text)  # 输出: Hex: ff# 十六进制(大写)
text = "Hex: {:X}".format(num)
print(text)  # 输出: Hex: FF

6. 格式化百分比

可以将浮点数格式化为百分比形式。

ratio = 0.75
text = "Percentage: {:.2%}".format(ratio)
print(text)  # 输出: Percentage: 75.00%

7. 格式化科学计数法

可以将数字格式化为科学计数法。

num = 123456789
text = "Scientific: {:.2e}".format(num)
print(text)  # 输出: Scientific: 1.23e+08

8. 格式化字符串字面量(f-string)

Python 3.6 引入了 f-string,它是一种更简洁的格式化方式。

name = "Alice"
age = 30
text = f"Name: {name}, Age: {age}"
print(text)  # 输出: Name: Alice, Age: 30

三. 字符串

使用 join() 方法拼接字符串列表。

words = ["Hello", "World"]
s = " ".join(words)  # 输出: Hello World

使用 find() 查找子字符串的位置(返回第一个匹配的索引,未找到返回 -1)。

s = "Hello World"
index = s.find("World")  # 输出: 6

 使用 index() 查找子字符串的位置(未找到会抛出异常)。

index = s.index("World")  # 输出: 6

使用 replace() 替换子字符串。

s = "Hello World"
new_s = s.replace("World", "Python")  # 输出: Hello Python

使用 split() 按分隔符分割字符串。

s = "Hello,World,Python"
parts = s.split(",")  # 输出: ['Hello', 'World', 'Python']

使用 upper() 转换为大写。

s = "Hello"
upper_s = s.upper()  # 输出: HELLO
使用 lower() 转换为小写。
lower_s = s.lower()  # 输出: hello

使用 strip() 去除两端空白。

s = "  Hello  "
stripped_s = s.strip()  # 输出: Hello
使用 lstrip() 去除左侧空白。
left_stripped_s = s.lstrip()  # 输出: Hello  
使用 rstrip() 去除右侧空白。
right_stripped_s = s.rstrip()  # 输出:   Hello

使用 isalpha() 判断是否全为字母。

result = "Hello".isalpha()  # 输出: True

使用 isdigit() 判断是否全为数字。

result = "123".isdigit()  # 输出: True

使用 isalnum() 判断是否全为字母或数字。

result = "Hello123".isalnum()  # 输出: True

使用 ljust() 左对齐并填充。
使用 rjust() 右对齐并填充。
使用 center() 居中对齐并填充。

s = "Hello"
aligned_s = s.ljust(10, "-")  # 输出: Hello-----aligned_s = s.rjust(10, "-")  # 输出: -----Helloaligned_s = s.center(10, "-")  # 输出: --Hello---

使用 count() 统计子字符串出现的次数。

s = "Hello Hello"
count = s.count("Hello")  # 输出: 2

使用切片反转字符串。

reversed_s = s[::-1]  # 输出: olleH

使用 zfill() 在字符串左侧填充零。

s = "42"
filled_s = s.zfill(5)  # 输出: 00042

四. 文件操作

1. 打开文件

使用 open() 函数打开文件,返回一个文件对象。

file = open(filename, mode, encoding)
参数:
filename: 文件名(包括路径)。mode: 文件打开模式(如 'r'、'w'、'a' 等)。encoding: 文件编码(如 'utf-8')。file = open("example.txt", "r", encoding="utf-8")

2. 文件打开模式

'r'    只读模式(默认)。
'w'    写入模式(覆盖文件)。
'a'    追加模式(在文件末尾添加内容)。
'x'    创建模式(文件已存在则报错)。
'b'    二进制模式(如 'rb'、'wb')。
't'    文本模式(默认)。
'+'    读写模式(如 'r+'、'w+')。


3. 读取文件

读取整个文件:
with open("example.txt", "r", encoding="utf-8") as file:content = file.read()print(content)逐行读取:
with open("example.txt", "r", encoding="utf-8") as file:for line in file:print(line.strip())  # 去除行尾换行符读取所有行到列表:
with open("example.txt", "r", encoding="utf-8") as file:lines = file.readlines()print(lines)读取指定字节数:
with open("example.txt", "r", encoding="utf-8") as file:chunk = file.read(10)  # 读取前 10 个字符print(chunk)

4. 写入文件

覆盖写入:
with open("example.txt", "w", encoding="utf-8") as file:file.write("Hello, World!")追加写入:
with open("example.txt", "a", encoding="utf-8") as file:file.write("\nAppended text.")写入多行:
lines = ["Line 1\n", "Line 2\n", "Line 3\n"]
with open("example.txt", "w", encoding="utf-8") as file:file.writelines(lines)

5. 关闭文件

使用 close() 方法关闭文件,或使用 with 语句自动关闭。

手动关闭:file = open("example.txt", "r")
content = file.read()
file.close()自动关闭(推荐):with open("example.txt", "r") as file:content = file.read()

6. 文件指针操作

获取当前指针位置:with open("example.txt", "r") as file:position = file.tell()print(position)移动指针位置:with open("example.txt", "r") as file:file.seek(10)  # 将指针移动到第 10 个字节content = file.read()print(content)

五. 集合

使用 add() 添加单个元素。

s = {1, 2, 3}
s.add(4)  # 输出: {1, 2, 3, 4}

使用 update() 添加多个元素。

s = {1, 2, 3}
s.update([4, 5, 6])  # 输出: {1, 2, 3, 4, 5, 6}

使用 remove() 删除指定元素(元素不存在会报错)。

s = {1, 2, 3}
s.remove(2)  # 输出: {1, 3}

使用 discard() 删除指定元素(元素不存在不会报错)。

s = {1, 2, 3}
s.discard(2)  # 输出: {1, 3}

使用 pop() 随机删除并返回一个元素。

s = {1, 2, 3}
element = s.pop()  # 可能输出: 1

使用 clear() 清空集合。

s = {1, 2, 3}
s.clear()  # 输出: set()

使用 union() 或 | 计算两个集合的并集。

s1 = {1, 2, 3}
s2 = {3, 4, 5}
result = s1.union(s2)  # 输出: {1, 2, 3, 4, 5}
result = s1 | s2  # 同上

使用 intersection() 或 & 计算两个集合的交集。

s1 = {1, 2, 3}
s2 = {3, 4, 5}
result = s1.intersection(s2)  # 输出: {3}
result = s1 & s2  # 同上

使用 difference() 或 - 计算两个集合的差集。

s1 = {1, 2, 3}
s2 = {3, 4, 5}
result = s1.difference(s2)  # 输出: {1, 2}
result = s1 - s2  

使用 symmetric_difference() 或 ^ 计算两个集合的对称差集(仅存在于一个集合中的元素)。

s1 = {1, 2, 3}
s2 = {3, 4, 5}
result = s1.symmetric_difference(s2)  # 输出: {1, 2, 4, 5}
result = s1 ^ s2  # 同上

 使用 issubset() 或 <= 判断一个集合是否是另一个集合的子集。

s1 = {1, 2}
s2 = {1, 2, 3}
result = s1.issubset(s2)  # 输出: True
result = s1 <= s2  # 同上

 使用 < 判断一个集合是否是另一个集合的真子集。

s1 = {1, 2}
s2 = {1, 2, 3}
result = s1 < s2  # 输出: True

使用 issuperset() 或 >= 判断一个集合是否是另一个集合的超集。
 

s1 = {1, 2, 3}
s2 = {1, 2}
result = s1.issuperset(s2)  # 输出: True
result = s1 >= s2  # 同上

使用 > 判断一个集合是否是另一个集合的真超集。
 

s1 = {1, 2, 3}
s2 = {1, 2}
result = s1 > s2  # 输出: True

使用 copy() 复制集合。
 

s1 = {1, 2, 3}
s2 = s1.copy()  # 输出: {1, 2, 3}

六. 库函数

bisect

1.bisect.bisect_left()

import bisect
lst = [1, 3, 4, 4, 6]
index = bisect.bisect_left(lst, 4)
print(index)  # 输出: 2

 2. bisect.bisect_right()

import bisect
lst = [1, 3, 4, 4, 6]
index = bisect.bisect_right(lst, 4)
print(index)  # 输出: 4

itertools

1.itertools.permutations()

import itertools
data = "ABC"
result = itertools.permutations(data, 2)
print(list(result))  # 输出: [('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'C'), ('C', 'A'), ('C', 'B')]

2.itertools.combinations()

import itertools
data = "ABC"
result = itertools.combinations(data, 2)
print(list(result))  # 输出: [('A', 'B'), ('A', 'C'), ('B', 'C')]

3.itertools.accumulate()

import itertools
data = [1, 2, 3, 4]
result = itertools.accumulate(data, lambda x, y: x + y)
print(list(result))  # 输出: [1, 3, 6, 10]

collections

1.collections.Counter

from collections import Counter
data = ["apple", "banana", "apple", "orange", "banana", "apple"]
counter = Counter(data)
print(counter)  # 输出: Counter({'apple': 3, 'banana': 2, 'orange': 1})

2.collections.defaultdict

from collections import defaultdict
dd = defaultdict(int)  # 默认值为 0
dd["apple"] += 1
print(dd["apple"])  # 输出: 1
print(dd["banana"])  # 输出: 0

3. collections.deque

from collections import deque
dq = deque([1, 2, 3])
dq.append(4)
print(dq) # 输出: deque([1, 2, 3, 4])from collections import deque
dq = deque([1, 2, 3])
dq.appendleft(0)
print(dq)  # 输出: deque([0, 1, 2, 3])from collections import deque
dq = deque([1, 2, 3])
item = dq.pop()
print(item)  # 输出: 3
print(dq)    # 输出: deque([1, 2])from collections import deque
dq = deque([1, 2, 3])
item = dq.popleft()
print(item)  # 输出: 1
print(dq)    # 输出: deque([2, 3])

functools

1. functools.lru_cache()

import functools@functools.lru_cache(maxsize=128)
def fibonacci(n):if n < 2:return nreturn fibonacci(n-1) + fibonacci(n-2)print(fibonacci(10))  # 输出: 55

2.functools.cache()  3.9+

import functools
@functools.cache
def factorial(n):if n == 0:return 1return n * factorial(n-1)
print(factorial(5))  # 输出: 120

3.functools.reduce()

import functools
data = [1, 2, 3, 4]
result = functools.reduce(lambda x, y: x + y, data)
print(result)  # 输出: 10

string

1.ascii_lowercase: 26小写字母

sys

1.sys.setrecursionlimit()

import sys
sys.setrecursionlimit(2000)

math

  1. math.sqrt() : 得到数字的平方根

  2. math.pow() : 计算一个数的幂

  3. math.exp() : 计算自然指数函数

  4. math.log() : 计算自然对数

  5. math.log10() : 计算以10为底的对数

  6. math.sin() : 计算正弦值

  7. math.cos() : 计算余弦值

  8. math.tan() : 计算正切值

  9. math.radians() : 将角度转换为弧度

  10. math.degrees() : 将弧度转换为角度

  11. math.ceil() : 向上取整

  12. math.floor() : 向下取整

  13. math.fabs() : 返回绝对值

  14. math.factorial() : 计算阶乘

  15. math.gcd() : 计算最大公约数

  16. math.pi : 数学常数π

  17. math.e : 数学常数e

heapq

1.heapq.heappush(heap, item)

import heapq
heap = []
heapq.heappush(heap, 3)
heapq.heappush(heap, 1)
heapq.heappush(heap, 2)
print(heap)  # 输出: [1, 3, 2]

 2.heapq.heappop(heap)

import heapq
heap = [1, 3, 2]
print(heapq.heappop(heap))  # 输出: 1
print(heap)  # 输出: [2, 3]

3.heapq.heapify(x)

import heapq
heap = [3, 1, 2]
heapq.heapify(heap)
print(heap)  # 输出: [1, 3, 2]

4.heapq.heappushpop(heap, item)

import heapq
heap = [1, 3, 2]
print(heapq.heappushpop(heap, 4))  # 输出: 1
print(heap)  # 输出: [2, 3, 4]

 datetime

1.datetime.date(year, month, day)

import datetime
date_obj = datetime.date(2023, 10, 5)
print(date_obj)  # 输出: 2023-10-05

2. datetime.time(hour, minute, second, microsecond)

import datetime
time_obj = datetime.time(14, 30, 45)
print(time_obj)  # 输出: 14:30:45

3. datetime.datetime(year, month, day, hour, minute, second, microsecond)

import datetime
datetime_obj = datetime.datetime(2023, 10, 5, 14, 30, 45)
print(datetime_obj)  # 输出: 2023-10-05 14:30:45

4. datetime.timedelta(days, seconds, microseconds, milliseconds, minutes, hours, weeks)

import datetime
delta = datetime.timedelta(days=5, hours=3)
print(delta)  # 输出: 5 days, 3:00:00

5. datetime.datetime.now()

import datetime
now = datetime.datetime.now()
print(now)  # 输出: 当前日期和时间,例如: 2023-10-05 14:30:45.123456

6. datetime 对象相减

import datetime# 创建两个 datetime 对象
dt1 = datetime.datetime(2023, 10, 5, 14, 30, 0)
dt2 = datetime.datetime(2023, 10, 10, 10, 15, 0)# 计算时间差
time_diff = dt2 - dt1
print(time_diff)  # 输出: 4 days, 19:45:00
print(type(time_diff))  # 输出: <class 'datetime.timedelta'>

7. datetime 对象加减 timedelta

import datetime# 创建一个 datetime 对象
dt = datetime.datetime(2023, 10, 5, 14, 30, 0)# 创建一个 timedelta 对象
delta = datetime.timedelta(days=3, hours=2, minutes=15)# 加法
new_dt = dt + delta
print(new_dt)  # 输出: 2023-10-08 16:45:00# 减法
new_dt = dt - delta
print(new_dt)  # 输出: 2023-10-02 12:15:00

8. timedelta 对象的使用

timedelta 对象表示时间间隔,可以通过以下属性访问其值:import datetime# 计算时间差
dt1 = datetime.datetime(2023, 10, 5, 14, 30, 0)
dt2 = datetime.datetime(2023, 10, 10, 10, 15, 0)
time_diff = dt2 - dt1# 访问 timedelta 的属性
print("天数:", time_diff.days)  # 输出: 天数: 4
print("秒数:", time_diff.seconds)  # 输出: 秒数: 71100 (19小时45分钟的秒数)
print("总秒数:", time_diff.total_seconds())  # 输出: 总秒数: 416100.0

Decimal

1. Decimal(value)

from decimal import Decimal# 创建 Decimal 对象
num1 = Decimal('10.5')
num2 = Decimal('3.2')print(num1)  # 输出: 10.5
print(num2)  # 输出: 3.2

七. 模板

1. 二分查找:

while left + 1 < right:mid = (right + left) // 2if 条件:left = mid else:right = mid return right 

2. 二位前缀和 & 差分

n = int(input())
matrix = []
for _ in range(n):matrix.append(list(map(int,input().split())))
s = [[0] * (n + 1) for _ in range(n + 1)]
for i, row in enumerate(matrix):for j, x in enumerate(row):s[i + 1][j + 1] = s[i + 1][j] + s[i][j + 1] - s[i][j] + x
mx = float('-inf')# 以下这四个循环是为了枚举所有子矩阵用的。
for x1 in range(1, n + 1):for y1 in range(1, n + 1):for x2 in range(1, n + 1):for y2 in range(1, n + 1):if x2 < x1 or y2 < y1:continuecurrent_sum = s[x2][y2] - s[x2][y1 - 1] - s[x1 - 1][y2] + s[x1 - 1][y1 - 1]mx = max(mx, current_sum)
print(mx)
# 二维差分
diff = [[0] * (n + 2) for _ in range(n + 2)]
for r1, c1, r2, c2 in queries:diff[r1 + 1][c1 + 1] += 1diff[r1 + 1][c2 + 2] -= 1diff[r2 + 2][c1 + 1] -= 1diff[r2 + 2][c2 + 2] += 1# 计算 diff 的二维前缀和(原地修改)
for i in range(1, n + 1):for j in range(1, n + 1):diff[i][j] += diff[i][j - 1] + diff[i - 1][j] - diff[i - 1][j - 1]# 保留中间 n*n 的部分,即为答案
diff = diff[1:-1]
for i, row in enumerate(diff):diff[i] = row[1:-1]
print(diff)

 3.快速幂

def fast_pow(base, exponent, mod=None):result = 1while exponent > 0:if exponent % 2 == 1:if mod is not None:result = (result * base) % modelse:result = result * baseif mod is not None:base = (base * base) % modelse:base = base * baseexponent = exponent // 2return result# 示例使用
base = 2
exponent = 10
mod = 1000000007
# 不使用取模
print(fast_pow(base, exponent))
# 使用取模
print(fast_pow(base, exponent, mod))

4.dijkstra

import heapq
from collections import defaultdictdef dijkstra(graph, start):# 初始化距离字典,将所有顶点的距离初始化为无穷大distances = {node: float('inf') for node in graph}# 起始顶点到自身的距离为 0distances[start] = 0# 优先队列,用于存储待处理的顶点及其距离,初始时只有起始顶点priority_queue = [(0, start)]while priority_queue:# 从优先队列中取出当前距离源点最近的顶点及其距离current_distance, current_node = heapq.heappop(priority_queue)# 如果当前取出的距离大于已记录的最短距离,跳过该顶点if current_distance > distances[current_node]:continue# 遍历当前顶点的所有邻接顶点for neighbor, weight in graph[current_node].items():# 计算从源点经过当前顶点到邻接顶点的距离distance = current_distance + weight# 如果该距离小于已记录的最短距离,更新最短距离if distance < distances[neighbor]:distances[neighbor] = distance# 将更新后的邻接顶点及其距离加入优先队列heapq.heappush(priority_queue, (distance, neighbor))return distances# 示例图的邻接表表示
graph = defaultdict(dict)
graph[0][1] = 4
graph[0][2] = 1
graph[1][2] = 2
graph[1][3] = 5
graph[2][1] = 2
graph[2][3] = 8
graph[2][4] = 10
graph[3][4] = 2
graph[4][3] = 2# 起始顶点
start_vertex = 0# 调用 Dijkstra 算法计算最短路径
shortest_distances = dijkstra(graph, start_vertex)# 输出结果
for vertex, distance in shortest_distances.items():print(f"从顶点 {start_vertex} 到顶点 {vertex} 的最短距离是: {distance}")

5.弗洛伊德

# 定义无穷大
INF = float('inf')def floyd_warshall(graph):# 获取图中顶点的数量num_vertices = len(graph)# 初始化距离矩阵,初始值为图的邻接矩阵dist = [row[:] for row in graph]# 弗洛伊德算法核心部分for k in range(num_vertices):for i in range(num_vertices):for j in range(num_vertices):# 如果经过顶点 k 可以使从 i 到 j 的距离更短,则更新距离if dist[i][k] != INF and dist[k][j] != INF and dist[i][k] + dist[k][j] < dist[i][j]:dist[i][j] = dist[i][k] + dist[k][j]return dist# 示例图的邻接矩阵表示
graph = [[0, 5, INF, 10],[INF, 0, 3, INF],[INF, INF, 0, 1],[INF, INF, INF, 0]
]# 调用弗洛伊德算法计算所有顶点对之间的最短路径
shortest_distances = floyd_warshall(graph)# 输出结果
for i in range(len(shortest_distances)):for j in range(len(shortest_distances[i])):if shortest_distances[i][j] == INF:print(f"从顶点 {i} 到顶点 {j} 的最短距离是: 无穷大")else:print(f"从顶点 {i} 到顶点 {j} 的最短距离是: {shortest_distances[i][j]}")

6.并查集

class UnionFind:def __init__(self, n):# 初始化每个元素的父节点为自身self.parent = [i for i in range(n)]def find(self, x):# 查找元素 x 的根节点while self.parent[x] != x:x = self.parent[x]return xdef union(self, x, y):# 合并元素 x 和 y 所在的集合root_x = self.find(x)root_y = self.find(y)if root_x != root_y:self.parent[root_x] = root_ydef is_connected(self, x, y):# 判断元素 x 和 y 是否在同一个集合中return self.find(x) == self.find(y)# 示例使用
uf = UnionFind(5)
uf.union(0, 1)
uf.union(1, 2)
print(uf.is_connected(0, 2))  # 输出: True
print(uf.is_connected(0, 3))  # 输出: False

 7.树状数组

class BinaryIndexedTree:def __init__(self, n):# 初始化树状数组,长度为 n + 1,因为树状数组的下标从 1 开始self.bit = [0] * (n + 1)self.n = ndef lowbit(self, x):# lowbit 函数用于获取 x 的最低位 1 所表示的数值return x & -xdef update(self, idx, val):# 单点更新操作,将原数组中 idx 位置的值增加 valwhile idx <= self.n:self.bit[idx] += validx += self.lowbit(idx)def query(self, idx):# 前缀和查询操作,计算原数组中从 1 到 idx 的元素和res = 0while idx > 0:res += self.bit[idx]idx -= self.lowbit(idx)return resdef range_query(self, left, right):# 区间和查询操作,计算原数组中从 left 到 right 的元素和return self.query(right) - self.query(left - 1)

 8.素数预处理

MX = 1000001
LPF = [0] * MX
for i in range(2, MX):if LPF[i] == 0:for j in range(i, MX, i):if LPF[j] == 0:LPF[j] = i

八. 其他用法

  1. zip(): 将多个可迭代对象“压缩”为一个元组迭代器,用于并行遍历多个序列。

  2. enumerate(): 为可迭代对象添加索引,返回 (索引, 元素) 的元组迭代器。

  3. all(): 判断可迭代对象中是否所有元素都为真(非零、非空、非 False)。

  4. any(): 判断可迭代对象中是否有任意一个元素为真。

  5. help(): 查看函数、模块或对象的帮助文档。

  6. lambda: 用于创建匿名函数,简化代码,通常用于定义简单的单行函数。

  7. key: 用于指定排序、分组等操作中的关键字函数,决定如何比较或处理元素。

  8. exit(): 结束程序

  9. pow(a,b,c)

  10. dfs.cache_clear()

    相关文章:

    算法题笔记(自用)——Python

    目录 一. 进制&位运算&ASCAII 二. format格式化输出 1. 基本用法 2. 位置参数 3. 格式化数字 4. 对齐和填充 5. 格式化二进制、八进制、十六进制 6. 格式化百分比 7. 格式化科学计数法 8. 格式化字符串字面量&#xff08;f-string&#xff09; 三. 字符串 使…...

    Fiji图像处理

    文章目录 一、Fiji —— 基于 imageJ 的免费且开源的图像处理软件1.1、工具安装&#xff08;免费&#xff09;1.2、源码下载&#xff08;免费&#xff09; 二、功能详解2.0、Fiji - ImageJ&#xff08;Web应用程序&#xff09;2.1、常用功能&#xff08;汇总&#xff09;2.2、F…...

    【数据结构】堆和priority_queue

    堆的定义 堆是什么&#xff1f;实际上堆是一种特殊的&#xff08;受限制的&#xff09;完全二叉树&#xff0c;它在完全二叉树的基础上要求每一个节点都要大于等于或者小于等于它的子树的所有节点。这个大于小于体现在节点的值或者权重。 如图所示&#xff1a; 根节点大于等于…...

    Vue的简单入门 三

    目录 侦听器 watch 注意 表单输入绑定 v-model v-model修饰符​编辑 lazy number Trim 模板引用 组件组成 组件引用三步走 组件的嵌套关系 header Main Aside Aritice Item App.vue组件引入三个子组件 组件的注册方式 全局注册组件的方法 (1) Vue 2 语…...

    kotlin的val声明的变量是常量吗

    kotlin的val声明的变量是常量吗 DeepSeek R1 思考 65 秒 思考过程 嗯&#xff0c;用户问的是Kotlin中的val声明的变量是不是常量。首先我需要回忆一下Kotlin的基础知识。记得在Kotlin里&#xff0c;val用来声明只读变量&#xff0c;也就是说一旦赋值之后就不能再重新赋值了。…...

    C# | 委托 | 事件 | 异步

    委托&#xff08;Delegate&#xff09;和事件&#xff08;Event&#xff09; 在C#和C中&#xff0c;委托&#xff08;Delegate&#xff09;与事件&#xff08;Event&#xff09;以及函数对象&#xff08;Function Object&#xff09;是实现回调机制或传递行为的重要工具。虽然…...

    算法日记33:14届蓝桥C++B冶炼金属(二分答案)

    一、题目&#xff1a; 二、题解&#xff1a; 1、思路解析&#xff1a; 1&#xff09;首先我们可以发现题目的样例数量为&#xff08; n < 1000 n<1000 n<1000&#xff09;&#xff0c;因此我们可以考虑 O ( n ∗ l o g n ) O(n*log^n) O(n∗logn)时间复杂度的算法 …...

    【YOLO V5】目标检测 WSL2 AutoDL VScode SSH

    【YOLO V5】目标检测 WSL2 AutoDL VScode SSH 前言整体思路理解向YOLO 目标检测完整流程 环境配置Anaconda 获取 YOLO 代码与预训练模型下载 YOLOv5 代码和预训练模型配置 YOLOV5 工程环境解压 YOLOv5 源代码 并 添加预训练模型调整依赖版本选择对应的 Python 解释器 数据集准备…...

    前端基础之ajax

    vue-cli配置代理服务器解决跨域问题 我们可以使用一个代理服务器8080&#xff0c;Vue项目8080发送请求向代理服务器8080发送请求&#xff0c;再由在理服务器转发给后端服务器 首先需要在vue.config.js中配置代理服务器 const { defineConfig } require(vue/cli-service) modul…...

    vscode离线配置远程服务器

    目录 一、前提 二、方法 2.1 查看vscode的commit_id 2.2 下载linux服务器安装包 2.3 安装包上传到远程服务器&#xff0c;并进行文件解压缩 三、常见错误 Failed to set up socket for dynamic port forward to remote port&#xff08;vscode报错解决方法&#xff09;-C…...

    C语言——string.h下的特殊库函数

    string.h下的特殊函数 strtok(分割字符串&#xff09;strerror(错误码信息&#xff09;memcpy(拷贝&#xff09;memmove(拷贝&#xff09;memset(设置内存&#xff09;memcmp(比较大小&#xff09; strtok(分割字符串&#xff09; char * strtok ( char * str, const char * s…...

    烟花燃放安全管控:智能分析网关V4烟火检测技术保障安全

    一、方案背景 在中国诸多传统节日的缤纷画卷中&#xff0c;烟花盛放、烧纸祭祀承载着人们的深厚情感。一方面&#xff0c;烟花璀璨&#xff0c;是对节日欢庆氛围的热烈烘托&#xff0c;寄托着大家对美好生活的向往与期许&#xff1b;另一方面&#xff0c;袅袅青烟、点点烛光&a…...

    【一个月备战蓝桥算法】递归与递推

    字典序 在刷题和计算机科学领域&#xff0c;字典序&#xff08;Lexicographical order&#xff09;也称为词典序、字典顺序、字母序&#xff0c;是一种对序列元素进行排序的方式&#xff0c;它模仿了字典中单词的排序规则。下面从不同的数据类型来详细解释字典序&#xff1a; …...

    二、Java-封装playwright UI自动化(根据官网执行步骤,首先封装BrowserFactory枚举类及BrowserManager)

    前言 查看playwright官网&#xff0c;api文档了解到&#xff0c;playwright的基本步骤&#xff1a; 1、实例化一个playwright 2、启动一个浏览器类型 3、打开一个页面 所以&#xff0c;在封装时需要有一个浏览器工厂类&#xff0c;定义不同的浏览器类型&#xff0c;在配置文…...

    java项目之基于ssm的在线视频网站开发(源码+文档)

    项目简介 基于ssm的在线视频网站开发实现了以下功能&#xff1a; 该系统的目标用户包括管理员&#xff0c;用户。管理员上传视频&#xff0c;管理视频&#xff0c;查看视频留言&#xff0c;回复视频留言&#xff0c;管理视频收藏信息&#xff0c;管理公告&#xff0c;管理用户…...

    观察者模式的C++实现示例

    核心思想 观察者模式是一种行为型设计模式&#xff0c;定义了对象之间的一对多依赖关系。当一个对象&#xff08;称为Subject&#xff0c;主题&#xff09;的状态发生改变时&#xff0c;所有依赖于它的对象&#xff08;称为Observer&#xff0c;观察者&#xff09;都会自动收到…...

    c语言中的主要知识点

    一、基础语法与结构 程序结构 包含顺序结构、选择结构&#xff08;if/switch&#xff09;、循环结构&#xff08;for/while/do-while&#xff09;。 程序必须包含且仅有一个main函数作为入口。 数据类型与变量 基本类型&#xff1a;整型&#xff08;int、long&#xff09;、浮…...

    Pytorch构建LeNet进行MNIST识别 #自用

    LeNet是一种经典的卷积神经网络&#xff08;CNN&#xff09;结构&#xff0c;由Yann LeCun等人在1998年提出&#xff0c;主要用于手写数字识别&#xff08;如MNIST数据集&#xff09;。作为最早的实用化卷积神经网络&#xff0c;LeNet为现代深度学习模型奠定了基础&#xff0c;…...

    docker:Dockerfile案例之自定义centos7镜像

    1 案例需求 自定义centos7镜像。要求&#xff1a; 默认登录路径为 /usr可以使用vim 2 实施步骤 编写dockerfile脚本 vim centos_dockerfile 内容如下&#xff1a; #定义父镜像 FROM centos:7#定义作者信息 MAINTAINER handsome <handsomehandsome.com># 设置阿里云…...

    post get 给后端传参数

    post 方式一 &#xff1a; data: params 作为请求体&#xff08;Request Body&#xff09;传递&#xff1a; 你已经展示了这种方式&#xff0c;通过data字段直接传递一个对象或数组。这种方式通常用于传递复杂的数据结构。dowmfrom: function (params) { return request({ u…...

    Linux 系统不同分类的操作命令区别

    Linux 系统有多种发行版,每种发行版都有其独特的操作命令和工具。以下是一些常见的分类及其操作命令的区别: 1. 基于 Red Hat 的发行版 (RHEL, CentOS, Fedora) 1.1 包管理 安装软件包: bash复制 sudo yum install <package> 更新软件包: bash复制 sudo yum update…...

    Checkpoint 模型与Stable Diffusion XL(SDXL)模型的区别

    Checkpoint 模型与 Stable Diffusion XL&#xff08;SDXL&#xff09;模型 在功能、架构和应用场景上有显著区别&#xff0c;以下是主要差异的总结&#xff1a; 1. 基础架构与定位 Checkpoint 模型 是基于 Stable Diffusion 官方基础模型&#xff08;如 SD 1.4/1.5&#xff09;…...

    软件工程与实践(第4版 新形态) 练习与实践1

    软件工程与实践&#xff08;第4版 新形态&#xff09; 练习与实践1 1.填空题 (1)程序&#xff0c;文档 (2)系统软件&#xff0c;支撑软件&#xff0c;应用软件 (3)系统方法 (4)软件开发和维护 (5)工程的概念、原理、技术和方法 (6)实现软件的优质高产 (7)软件开发技术和…...

    探秘基带算法:从原理到5G时代的通信变革【九】QPSK调制/解调

    文章目录 2.8 QPSK 调制 / 解调简介QPSK 发射机的实现与原理QPSK 接收机的实现与原理QPSK 性能仿真QPSK 变体分析 本博客为系列博客&#xff0c;主要讲解各基带算法的原理与应用&#xff0c;包括&#xff1a;viterbi解码、Turbo编解码、Polar编解码、CORDIC算法、CRC校验、FFT/…...

    侯捷 C++ 课程学习笔记:深入理解智能指针

    文章目录 每日一句正能量一、引言二、智能指针的核心概念&#xff08;一&#xff09;std::unique_ptr&#xff08;二&#xff09;std::shared_ptr&#xff08;三&#xff09;std::weak_ptr 三、学习心得四、实际应用案例五、总结 每日一句正能量 如果说幸福是一个悖论&#xff…...

    基于Qwen-VL的手机智能体开发

    先上Demo&#xff1a; vl_agent_demo 代码如下&#xff1a; 0 设置工作目录&#xff1a; 你的工作目录需要如下&#xff1a; 其中utils文件夹和qwenvl_agent.py均参考自 GitHub - QwenLM/Qwen2.5-VL: Qwen2.5-VL is the multimodal large language model series developed by …...

    系统盘还原成正常U盘

    选择格式化,等格式化完毕就完了 点击还原设备的默认值格式化就完了...

    Leetcode 103: 二叉树的锯齿形层序遍历

    Leetcode 103: 二叉树的锯齿形层序遍历 问题描述&#xff1a; 给定一个二叉树&#xff0c;返回其节点值的锯齿形层序遍历&#xff08;即第一层从左到右&#xff0c;第二层从右到左&#xff0c;第三层从左到右&#xff0c;依此类推&#xff09;。 适合面试的解法&#xff1a;广…...

    FastGPT 引申:基于 Python 版本实现 Java 版本 RRF

    文章目录 FastGPT 引申&#xff1a;基于 Python 版本实现 Java 版本 RRF函数定义使用示例 FastGPT 引申&#xff1a;基于 Python 版本实现 Java 版本 RRF 函数定义 使用 Java 实现 RRF 相关的两个函数&#xff1a;合并结果、过滤结果 import java.util.*;// 搜索结果类型定义…...

    C++中的无锁编程

    引言 在当今多核处理器普及的时代&#xff0c;并发编程已成为高性能应用程序开发的关键技术。传统的基于锁的同步机制虽然使用简单&#xff0c;但往往会带来性能瓶颈和死锁风险。无锁编程&#xff08;Lock-Free Programming&#xff09;作为一种先进的并发编程范式&#xff0c…...

    【全栈开发】---- 一文掌握 Websocket 原理,并用 Django 框架实现

    目录 介绍 底层原理 握手环节详解&#xff1a; 收发数据&#xff08;加密&#xff09; Django 中配置 channels 1、注册 channels 2、在 settings.py 中添加 asgi_application 3、修改 asgi.py 文件 4、routing 5、consumers 实现 聊天室 介绍 WebSocket是一种先进的通信协议&…...

    游戏引擎学习第135天

    仓库:https://gitee.com/mrxiao_com/2d_game_3 回顾 game_asset.cpp 的创建 在开发过程中&#xff0c;不使用任何现成的游戏引擎或第三方库&#xff0c;而是直接基于 Windows 进行开发&#xff0c;因为 Windows 目前仍然是游戏的标准平台&#xff0c;因此首先在这个环境中进行…...

    国内支持Stable Diffusion模型的平台

    国内支持Stable Diffusion模型的平台 截至2025年3月&#xff0c;国内支持SD模型的平台主要包括以下六类&#xff0c;覆盖不同用户需求和技术层级&#xff1a; 一、模型分享与下载平台 Liblib.ai 描述&#xff1a;国内最大SD原创模型社区&#xff0c;提供海量基础模型、Lora…...

    扣子(Coze):重构AI时代的工作流革命

    文章目录 扣子&#xff08;Coze&#xff09;&#xff1a;重构AI时代的工作流革命使用Coze&#xff1a;一、工作流的本质&#xff1a;从单点智能到系统智能二、扣子工作流的技术基因三、场景化实践&#xff1a;从知识库到智能员工四、未来图景&#xff1a;AI Agent的进化之路结语…...

    alloc、malloc 与 allocator:内存管理三剑客

    内存管理是C语言开发者的核心能力&#xff0c;也是系统级编程的基石。 一、内存分配三剑客&#xff1a;malloc/calloc/realloc 1. malloc函数原理 int* arr (int*)malloc(5 * sizeof(int)); // 分配20字节空间&#xff08;假设int为4字节&#xff09; 从堆区分配指定字节的连…...

    单细胞分析(21)——SCENIC 分析流程(singularity容器版)

    SCENIC 分析流程笔记 SCENIC (Single-Cell rEgulatory Network Inference and Clustering) 是一种基于单细胞 RNA 测序数据的调控网络分析方法&#xff0c;主要用于识别调控因子&#xff08;TFs&#xff09;及其靶基因&#xff08;Regulons&#xff09;&#xff0c;并评估这些…...

    亚马逊云科技Marketplace(中国区)上架专业服务产品, “云生态连接器”价值凸显

    近日&#xff0c;由西云数据运营的亚马逊云科技Marketplace&#xff08;中国区&#xff09;正式支持专业服务产品。此次发布将大幅简化企业对云专业服务的采购流程&#xff0c;实现云软件从规划、部署到支持的全生命周期管理&#xff0c;同时也为合作伙伴提供了更多的销售机会。…...

    拉普拉斯·隆格·楞次矢量

    L − R − L L-R-L L−R−L 矢量的推导 有平方反比有心力&#xff1a; F ⃗ − k r 2 r ^ \vec F-\dfrac{k}{r^2}\hat r F −r2k​r^ 显然角动量 L ⃗ r ⃗ p ⃗ \vec L\vec r\times \vec p L r p ​ 守恒。 故 ∣ L ⃗ ∣ Const \begin{vmatrix}\vec L\end{vmatrix}\…...

    GStreamer —— 2.3、Windows下Qt加载GStreamer库后运行 - “教程3:动态管道“(附:完整源码)

    运行效果&#xff08;音频&#xff09; 简介 上一个教程演示了GStreamer 概念。本教程中的管在它设置为 playing 状态之前完全构建。这没关系。如果 我们没有采取进一步的行动&#xff0c;数据会到达 pipeline 的 pipeline 和 pipeline 将生成错误消息并停止。但 我们将采取进一…...

    jupyter notebook更改文件存储路径

    默认情况打开是这样的 进入cmd或者Anaconda Prompt&#xff0c;输入以下命令 jupyter notebook --generate-config进入该目录 打开该文件&#xff0c;CTRLF 查找c.ServerApp.root_dir 进行修改。 这样就修改好啦&#xff01;...

    基于遗传算法的无人机三维路径规划仿真步骤详解

    基于遗传算法的无人机三维路径规划仿真步骤详解 一、问题定义 目标:在三维空间内,寻找从起点到终点的最优路径,需满足: 避障:避开所有障碍物。路径最短:总飞行距离尽可能短。平滑性:转折角度不宜过大,降低机动能耗。输入: 三维地图(含障碍物,如立方体、圆柱体)。起…...

    ①EtherCAT转Modbus485RTU网关多路同步高速采集无需编程串口服务器

    EtherCAT转Modbus485RTU网关多路同步高速采集无需编程串口服务器https://item.taobao.com/item.htm?ftt&id798036415719 型号 1路总线EC网关 MS-A2-1011 2路总线EC网关 MS-A2-1021 4路总线EC网关 MS-A2-1041 EtherCAT 串口网关 EtherCAT 转 RS485 技术规格 …...

    Spring Boot WebFlux 中 WebSocket 生命周期解析

    Spring Boot WebFlux 中的 WebSocket 提供了一种高效、异步的方式来处理客户端与服务器之间的双向通信。WebSocket 连接的生命周期包括连接建立、消息传输、连接关闭以及资源清理等过程。此外&#xff0c;为了确保 WebSocket 连接的稳定性和可靠性&#xff0c;我们可以加入重试…...

    集合论之集合的表示法

    目录 1. 说明 2. 常用表示法 2.1 枚举法(Roster Notation) 2.2 构建法(Set-builder notation) 3. 其它表示法 1. 说明 要表示一个集合&#xff0c;可以直接列出其元素&#xff0c;或者提供一种可以唯一地刻画其元素的方当。 2. 常用表示法 2.1 枚举法(Roster Notatio…...

    【C语言】值传递与指针传递,以及 `.` 和 `->` 操作详解

    在 C 语言中,函数参数的传递机制和结构体成员的访问方式是编程中的核心概念。值传递(pass-by-value)和指针传递(pass-by-pointer)决定了函数如何处理传入的数据,而 . 操作符 和 -> 操作符 则是访问结构体成员的两种主要工具。这两者密切相关,尤其在处理结构体时,它们…...

    机器人训练环境isaac gym以及legged_gym项目的配置问题

    完整的安装环境教程(强烈推荐):...

    DeepSeek 开源周回顾「GitHub 热点速览」

    上周&#xff0c;DeepSeek 发布的开源项目用一个词形容就是&#xff1a;榨干性能&#xff01;由于篇幅有限&#xff0c;这里仅列出项目名称和简介&#xff0c;感兴趣的同学可以前往 DeepSeek 的开源组织页面&#xff0c;深入探索每个项目的精彩之处&#xff01; 第一天 FlashML…...

    冯 • 诺依曼体系结构

    文章目录 冯 • 诺依曼体系结构的介绍冯 • 诺依曼体系结构的由来内存是如何提高冯•诺依曼体系结构效率的&#xff1f;为什么程序运行之前必须先加载到内存&#xff1f;从软件层面上再理解冯 • 诺依曼体系结构&#xff08;QQ聊天的数据流动&#xff09;一些知识的补充 冯 • …...

    软考架构师笔记-存储管理

    1.5 存储管理 存储管理 页式存储组织 虚地址 页号 | 页内地址页表 页号 | 块号物理地址 块号 | 页内地址访存两次&#xff1a;访问页表得到物理地址&#xff0c;根据物理地址得到数据就是把用户程序的空间分成若干页&#xff0c;把内存空间分成若干块&#xff0c;块和页的…...

    【杂谈】信创电脑华为w515(统信系统)登录锁定及忘记密码处理

    华为w515麒麟芯片版&#xff0c;还有非麒麟芯片版本&#xff0c;是一款信创电脑&#xff0c;一般安装的UOS系统。 准备一个空U盘&#xff0c;先下载镜像文件及启动盘制作工具&#xff0c;连接如下&#xff1a; 百度网盘 请输入提取码 http://livecd.uostools.com/img/apps/l…...