405 小Q的非素数和排列问题
def is_prime(num):
if num<=1:
return False
for i in range(2,int(num**0.5)+1):
if num%i==0:
return False
return True
from itertools import permutations
def solution(n: int) -> int:
cnt = 0
# 生成所有排列
for perm in permutations(range(1, n + 1)):
valid = True
# 检查每个排列是否满足条件
for i in range(n - 1):
if is_prime(perm[i] + perm[i + 1]):
valid = False
break
if valid:
cnt += 1
return cnt
代码解析
is_prime 函数:
这个函数用于检查一个给定的数 num 是否是质数。
如果 num 小于或等于 1,它不是质数,函数返回 False。
然后,函数遍历从 2 到 num 的平方根(包含)的所有整数,检查 num 是否能被这些数整除。
如果 num 能被任何这些数整除,那么 num 不是质数,函数返回 False。
如果 num 不能被这些数中的任何一个整除,那么 num 是质数,函数返回 True。
solution 函数:
这个函数接受一个整数 n 作为参数,并返回满足条件的排列数量
cnt 初始化为 0,用于计数满足条件的排列。
使用 itertools.permutations 生成从 1 到 n 的所有可能的排列。
对于每个排列,使用一个 valid 标志来检查排列是否满足条件(即不包含连续质数对)。
对于排列中的每对连续数字,检查它们的和是否是质数。如果是,设置 valid 为 False 并跳出当前循环。
如果排列通过了所有检查(即 valid 保持为 True),则增加 cnt 的值。
最后,函数返回 cnt 的值,即满足条件的排列数量。
学习内容
permutations函数
用于生成输入序列的所有可能排列。排列是将一个集合的所有成员排列成某种顺序或序列
接受两个参数:
- iterable:要生成排列的序列。
- r:可选参数,指定从序列中每次取出的元素数量,默认为序列的长度。如果 r 大于序列长度,将返回空迭代器。
351判断回旋镖
def solution(points: list) -> bool:
if len(set(map(tuple, points))) != 3:
return False
# 计算斜率
x1, y1 = points[0]
x2, y2 = points[1]
x3, y3 = points[2]
if (y2 - y1) * (x3 - x1) != (y3 - y1) * (x2 - x1):
return True
# 否则返回 False
return False
代码解析
检查点的唯一性:
首先,代码检查输入的点是否都是唯一的。这是通过将点的坐标转换为元组,并使用 set 来去除重复的点来实现的。如果 set 的长度不等于3,说明三个点中存在重复的点,因此它们不可能构成一个三角形,函数直接返回 False。
计算斜率:
如果三个点都是唯一的,代码继续计算由这三个点中的任意两个点构成的两条直线的斜率。
对于点 A(x1, y1) 和 B(x2, y2),斜率是 (y2 - y1) / (x2 - x1)。
对于点 A(x1, y1) 和 C(x3, y3),斜率是 (y3 - y1) / (x3 - x1)。
判断共线性:
如果两条直线的斜率不相等,那么这三个点不共线,函数返回 True。
如果斜率相等,那么这三个点共线,函数返回 False。
学习内容
从AI中学到的一点就是将除法转变为乘法计算,这样可以减少余数的问题。