算法刷题总结

本文最后更新于:2025年3月18日 晚上

快读

1
2
3
4
# 快读模板
import sys

input = lambda:sys.stdin.readline().strip()

lambda

1
2
3
4
5
6
7
# lambda 函数的语法结构为 lambda 参数列表: 表达式
lambda x, target: f(x) > target

# 上述 lambda 函数可以用常规函数定义来替代,如下所示:
def check(x, target):
return f(x) > target

输入

例1
1
2
3
4
n = int(input()) 
a = [int(x) for x in input().split()]

print(*a)
1
2
3
4
n = int(input()) 
nums = list(map(int, input().split()))

print(*nums)
例2
1
n, m = map(int, input().split())
1
2
print(1204) 输出的是整数,int类型
print('1204')print("1204")输出的是字符串,str类型
例三

1
2
3
n = int(input())
a, b = zip(*[map(int, input().split()) for _ in range(n)]) # a, b 要分开用的场景

二分-bisect

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 单调不减数组

i = bisect(arr, x) # 返回恰好大于x的下标位置,
# 也可以理解为它的作用是在有序序列中找出目标元素应该插入的最右边位置,从而保证序列的有序性。若序列中存在和目标元素相等的元素,返回的索引是该相等元素最后的位置。


# 下面是其变形
# 恰好大于等于x的下标位置
i = bisect(arr, x - 1)


# 恰好小于等于x的下标位置
i = bisect(arr, x) - 1

# 注意,bisect其实有4个参数
bisect(a, x, lo=0, hi=len(a))



greater = n - bisect(arr, x) # arr中有多少个数严格大于x
lesser = bisect(arr, x - 1) # arr中有多少个数严格小于x

enumerate

enumerate 函数基本用法:

enumerate 函数的基本语法是 enumerate(iterable, start=0),其中:

  • iterable:是一个必需的参数,表示要进行枚举的可迭代对象,例如列表、元组、字符串等。
  • start:是一个可选参数,用于指定索引的起始值,默认值为 0。
1
2
3
4
5
people = [[6,0],[5,0],[4,0],[3,2],[2,2],[1,4]]
for i, p in enumerate(people): # enumerate 函数:用于同时获取列表的索引 i 和元素 p
h, k = p[0], p[1]
……

res.append,res.insert

1
2
3
4
5
6
# 在列表末尾加上一个元素
res.append()

# 在下标为 3 的前面插入一个元素 99,Python列表的下标从0开始
res.insert(3, 99)

两个长度相同列表对应元素相减

1
result = [a - b for a, b in zip(list1, list2)]

列表的排序

1
2
3
4
5
6
7
nums = [1, 5, 9, 6]
try:
# nums 列表中的元素是整数,整数是不可索引的对象,不能使用 x[1] 这样的索引操作。
# x[1] 这种写法通常用于可迭代对象(如列表、元组等),它的意思是取可迭代对象中索引为 1 的元素。但整数并没有索引的概念,所以会引发 TypeError 异常。
nums.sort(key = lambda x : x[1])
except TypeError as e:
print(f"出现错误: {e}")
1
2
3
4
# 这个想排序的话,直接:
nums.sort() # 从小到大 [1, 5, 6, 9]
nums.sort(reverse = True) # 从大到小 [9, 6, 5, 1]

如果 nums 是一个嵌套列表,key 参数就可以发挥作用。例如:

1
2
3
4
5
nums = [[1, 2], [5, 3], [9, 1], [6, 4]]
# 在这个例子中,nums 是一个嵌套列表,每个子列表有两个元素。
# key = lambda x : x[1] 表示按照每个子列表中索引为 1 的元素进行排序,即第二个元素,排序后:[[9, 1], [1, 2], [5, 3], [6, 4]]
nums.sort(key = lambda x : x[1])
print(nums)

all()、any()

all() 函数

all() 函数用于判断可迭代对象中的所有元素是否都为真值。在 Python 中,像 0None、空列表 []、空元组 ()、空字典 {}、空集合 set() 等会被视为假值,其余大部分值都被当作真值。

1
all(iterable)
  • iterable:是一个可迭代对象,例如列表、元组、集合等。

  • 若可迭代对象中的所有元素都为真值,或者可迭代对象为空,all() 函数返回 True

  • 若可迭代对象中存在一个假值,all() 函数返回 False

1
2
3
4
5
6
7
8
9
10
11
# 列表中所有元素都为真值
list1 = [1, 2, 3, 4]
print(all(list1)) # 输出: True

# 列表中存在假值
list2 = [1, 0, 3, 4]
print(all(list2)) # 输出: False

# 空列表
empty_list = []
print(all(empty_list)) # 输出: True

any() 函数

any() 函数用于判断可迭代对象中是否存在至少一个真值。

1
any(iterable)
  • iterable:同样是一个可迭代对象。

  • 若可迭代对象中存在至少一个真值,any() 函数返回 True

  • 若可迭代对象中的所有元素都是假值,或者可迭代对象为空,any() 函数返回 False

1
2
3
4
5
6
7
8
9
10
11
# 列表中存在真值
list3 = [0, 0, 3, 0]
print(any(list3)) # 输出: True

# 列表中所有元素都是假值
list4 = [0, 0, 0, 0]
print(any(list4)) # 输出: False

# 空列表
empty_list = []
print(any(empty_list)) # 输出: False

钻牛角尖了

P8218 【深进1.例1】求区间和 - 洛谷

看一下下面两段代码,在刚开始我的理解中,一直觉得要写成第二个的类型,因为对于第一个,你输入一个,它就立马输出了呀,可是我们这里的m大于1,它不符合,就是下面这样:

image-20250313164125423

但实际情况是,如果你直接复制粘贴过来,它也是对的

image-20250313164232188

我认为是要把它存入一个列表里面,最后一起输出,但是也不尽相同,豆包如是说:

当你按下回车键确认输入后,程序会将输入的内容按照换行符或空格进行分割,然后依次读取每个查询的左右边界值,并根据前缀和数组计算并输出相应的区间和。

例如,你一次性输入1 42 3,中间以换行符分隔,程序会先读取1 4,计算并输出对应的区间和10,然后再读取2 3,计算并输出对应的区间和5

所以总结来说就是——都行!别钻牛角尖了

1
2
3
4
5
6
7
8
9
10
11
12
# 一
n = int(input())
a = list(map(int, input().split()))
m = int(input())

p = [0] * (n + 1)
for i in range(n):
p[i + 1] = p[i] + a[i]

for i in range(m):
l, r = map(int, input().split())
print(p[r] - p[l - 1])
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 二
n = int(input())
a = list(map(int, input().split()))
m = int(input())

p = [0] * (n + 1)
for i in range(n):
p[i + 1] = p[i] + a[i]

res = [0] * m
for i in range(m):
l, r = map(int, input().split())
res[i] = p[r] - p[l - 1]

print(*res, sep = '\n')

K

蓝桥杯攻略!省一经验+考试全流程+技巧分享-CSDN博客

总结:

平时不要太在意在群里看见别人刷了几百道题了,那个数字并不是很重要。如果把一道题真的弄懂了,那么相应的那个知识点相应的一系列题目你自然就会了。

再说了,难道因为自己刷的题没别人多就不学啦?

所以保持好心态,你就会发现又AC一道题的时候有多快乐啦~

希望可以帮到你们~加油加油!

k02

算法刷题总结
http://viper2383.github.io/2025/03/05/算法刷题总结/
作者
w1per3
发布于
2025年3月5日
许可协议