【蓝桥杯】3月27日笔记
1.暴力枚举
给定一个正整数n,请找出所有满足a² + b² = n的整数对(a, b),其中a和b都是正整数,且a ≤ b。
输入格式:一个正整数n (1 ≤ n ≤ 10⁶)
输出格式:所有符合条件的(a, b)对,每行一对,按a的升序排列。如果没有符合条件的对,输出"No solution"。
问题分析:我们需要找到所有满足a² + b² = n的正整数对(a, b),其中a ≤ b。
枚举策略:由于a和b都是正整数且a ≤ b,a的最大可能值是√(n/2),因为如果a > √(n/2),那么a² > n/2,b² = n - a² < n/2 < a²,这将导致b < a,与a ≤ b矛盾。
算法选择:采用枚举算法,遍历a的所有可能取值,对于每个a,计算b² = n - a²,然后检查b是否为整数。
优化:在枚举a时,只需要枚举到√(n/2)即可,减少不必要的计算。
import math
def find_num(n):
result=[]
max_a=math.isqrt(n//2) #计算n//2的整数平方根
for a in range(1,max_a+1):
remainder=n-a*a
b=math.isqrt(remainder)
if b*b==remainder and b>=a:
result.append((a,b))
return result
n=int(input("请输入一个整数:"))
pairs=find_num(n)
if not pairs:
print("No solution")
else:
for a,b in pairs:
print(a,b)
input()
input()会
读取用户输入的内容,并将其作为字符串返回。
例如,当用户在控制台输入 3 1 4 1 5
并按下回车键,input()
就会返回字符串 "3 1 4 1 5"
。
2.快速排序
def quick_sort(arr):
if len(arr)<=1:
return arr
else:
mid=arr[0]
left=[x for x in arr[1:] if x<=mid]
right=[x for x in arr[1:] if x>mid]
return quick_sort(left)+[mid]+quick_sort(right)
arr=list(map(int,input().split()))
sorted_arr=quick_sort(arr)
print(" ".join(map(str,sorted_arr)))
input().split()
split()
会将一个字符串按照指定的分隔符(如果不指定分隔符,默认使用如空格作为分隔符)分割成多个子字符串,并返回一个包含这些子字符串的列表。
input().split()
会把用户输入的字符串按空格分割成多个子字符串。
以上面的输入 "3 1 4 1 5"
为例,input().split()
会返回 ['3', '1', '4', '1', '5']
,注意这里列表中的元素仍然是字符串类型。
map(int, input().split())
map()
接收两个参数:一个函数和一个可迭代对象(如列表、元组等)。
map()
函数会将传入的函数应用到可迭代对象的每个元素上,并返回一个迭代器,这个迭代器中的元素是原可迭代对象元素经过函数处理后的结果。
list(map(int, input().split()))
list()
是 Python 的内置函数,用于将一个可迭代对象转换为列表。
Python 列表推导式(List Comprehension)
列表推导式是一种简洁的创建列表的方式,它允许你在一行代码中生成一个新的列表。
[expression for item in iterable if condition]
left = [x for x in arr[1:] if x <= pivot]
" ".join(map(str, sorted_arr))
join()
是字符串对象的一个方法,它的作用是将一个可迭代对象中的元素连接成一个字符串。调用该方法的空格字符串" "
会作为连接这些元素的分隔符。
3.归并排序
def merge(left, right):
result = []
i = j = 0
while i < len(left) and j < len(right):
if left[i] < right[j]:
result.append(left[i])
i = i + 1
else:
result.append(right[j])
j = j + 1
while i < len(left):
result.append(left[i])
i = i + 1
while j < len(right):
result.append(right[j])
j = j + 1
return result
def merge_sort(arr):
if len(arr) <= 1:
return arr
mid = len(arr) // 2
left = merge_sort(arr[:mid])
right = merge_sort(arr[mid:])
return merge(left, right)
weights = list(map(int, input().split()))
sorted_weights = merge_sort(weights)
print(" ".join(map(str, sorted_weights)))
4.桶排序
input_str = input()
# 初始化桶
buckets = [0] * 26
for char in input_str:
# 计算字符对应的桶索引
index = ord(char) - ord('a')
buckets[index] += 1
# 遍历 26 个桶
for i in range(26):
# 如果桶中的计数不为 0,说明该字符出现过
if buckets[i] > 0:
# 根据索引计算对应的字符
char = chr(i + ord('a'))
# 输出字符及其出现次数
print(f"{char}: {buckets[i]}")