【算法】【Python】蓝桥杯Python组比赛技巧

1. 序列翻转(使用 [::-1])

# 翻转字符串
s = "abcdef"
print("原始字符串:", s)
print("翻转后:", s[::-1])

# 翻转列表
lst = [1, 2, 3, 4, 5]
print("原始列表:", lst)
print("翻转后:", lst[::-1])

说明: 利用切片中的步长为 -1 可快速得到一个序列的倒序。

2. 数字转二进制和十六进制(使用 bin() 与 hex())

num = 255
print("数字", num, "的二进制表示:", bin(num))   # 输出 0b11111111
print("数字", num, "的十六进制表示:", hex(num))  # 输出 0xff

说明: 内置函数 bin() 和 hex() 可将整数转换为对应的二进制和十六进制字符串。

3. 利用 eval() 解析数学表达式

expression = "2 + 3 * (4 - 1)"
result = eval(expression)
print("表达式", expression, "的计算结果是:", result)

说明: eval() 可以将字符串形式的数学表达式解析并计算,但在使用时请确保传入的表达式是安全的,避免安全风险。

4. 自定义排序写法

# 示例1:对数字列表进行降序排序
nums = [5, 2, 9, 1, 7]
sorted_nums = sorted(nums, key=lambda x: x, reverse=True)
print("降序排序结果:", sorted_nums)

# 示例2:对含元组的列表按照元组第二个元素排序
fruits = [("apple", 3), ("banana", 2), ("cherry", 5)]
sorted_fruits = sorted(fruits, key=lambda item: item[1], reverse=True)
print("按照数量降序排序的水果:", sorted_fruits)

说明: 使用 sorted() 的 key 参数可以自定义排序规则,reverse=True 表示降序排列。

5. 使用 enumerate() 遍历序列

lst = ['a', 'b', 'c', 'd']
# 同时获取索引和值
for index, value in enumerate(lst):
    print("索引:", index, "对应的值:", value)

说明: enumerate() 是遍历序列时同时获得元素索引和对应值的一种便捷方法。

6. 字符串、字典、集合、列表的常见操作

# 字符串操作
text = "Hello, World!"
print("大写:", text.upper())
print("小写:", text.lower())
print("查找子串 'World' 的位置:", text.find("World"))

# 列表操作
lst = [3, 1, 4, 1, 5, 9]
lst.append(2)           # 添加元素
lst.sort()              # 排序
print("排序后的列表:", lst)

# 字典操作
person = {"name": "Alice", "age": 25}
person["city"] = "Beijing"  # 添加新键值对
for key, value in person.items():
    print(f"{key}: {value}")

# 集合操作
s = {1, 2, 3, 4}
s.add(5)                    # 添加元素
s.remove(3)                 # 删除元素
print("集合内容:", s)

说明: 熟悉常用数据结构(字符串、列表、字典、集合)的内置方法和操作方式,对于快速开发和算法竞赛中调试问题非常有帮助。

7. 使用 itertools.combinations 求组合数

from itertools import combinations

items = [1, 2, 3, 4]
# 求 2 个元素的所有组合
comb = list(combinations(items, 2))
print("所有2元素组合:", comb)

说明: combinations 能够生成给定序列中指定长度的所有可能组合,适合需要穷举组合情况的算法题。

8. 使用 itertools.permutations 求全排列

from itertools import permutations

items = [1, 2, 3]
# 求全排列(长度为3,即全部元素全排列)
perm = list(permutations(items, 3))
print("全排列结果:", perm)

说明: permutations 用于生成序列所有可能的排列,常见于涉及排列问题的场景。

9. 使用 collections.deque 实现双端队列

from collections import deque

d = deque([1, 2, 3])
d.append(4)        # 从右侧添加
d.appendleft(0)    # 从左侧添加
print("双端队列内容:", d)
d.pop()            # 从右侧弹出
d.popleft()        # 从左侧弹出
print("操作后的双端队列:", d)

说明: deque 是一个高效的双端队列数据结构,在需要频繁从两端添加或删除元素时非常高效。

10. 使用 math.factorial() 计算阶乘

import math

n = 5
result = math.factorial(n)
print(f"{n} 的阶乘是:", result)

说明: math.factorial() 用于计算正整数的阶乘,常用于排列组合计算中。

11. 日期处理(使用 datetime 与 timedelta)

from datetime import datetime, timedelta

# 获取当前时间
now = datetime.now()
print("当前时间:", now)

# 计算一天后的日期时间
tomorrow = now + timedelta(days=1)
print("一天后的时间:", tomorrow)

# 日期格式化
formatted = now.strftime("%Y-%m-%d %H:%M:%S")
print("格式化后的时间:", formatted)

说明: datetime 和 timedelta 可以方便地进行日期与时间的计算与格式化,在处理时间相关问题时很实用。

更多示例看下面文章:

13. 使用 collections.Counter 计数字典

import collections

# 统计字符串中各字符出现的次数
data = "abracadabra"
counter = collections.Counter(data)
print("字符计数:", counter)

说明: Counter 可以自动统计可迭代对象中各元素出现的次数,适用于频次统计、查找众数等场景。

14. 使用 OrderedDict 创建有序字典

from collections import OrderedDict

od = OrderedDict()
od['first'] = 1
od['second'] = 2
od['third'] = 3

# 即使插入顺序很重要,遍历时也会按照插入顺序显示
for key, value in od.items():
    print(key, ":", value)

说明: OrderedDict 会保存字典中元素的插入顺序,在某些需要保持顺序的场景下非常有用。

15. 使用 queue.PriorityQueue 实现优先队列

from queue import PriorityQueue

pq = PriorityQueue()
# 放入数据:(优先级, 数据内容)——注意优先级数字越小优先级越高
pq.put((2, "Task2"))
pq.put((1, "Task1"))
pq.put((3, "Task3"))

while not pq.empty():
    priority, task = pq.get()
    print("处理任务:", task, "优先级:", priority)

说明: PriorityQueue 非常适合调度或任务排序场景,通过设置优先级数字来控制顺序。

16. 使用 heapq 实现小顶堆

import heapq

heap = []
# 将数据加入堆中
heapq.heappush(heap, 5)
heapq.heappush(heap, 2)
heapq.heappush(heap, 8)
heapq.heappush(heap, 1)

print("堆中的元素:", heap)
# 弹出最小的元素
min_value = heapq.heappop(heap)
print("弹出的最小元素:", min_value)
print("剩余堆:", heap)

说明: heapq 模块提供了堆操作,可以实现优先队列等功能。默认是小顶堆,即最小值总在堆顶。

© 版权声明
THE END
点赞12 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容