1.大家好
2…这一段时间做的一点题目
感觉PTA上强度了
3.0.学习了深度度优先算法
具体来说就是递归和回溯,我学的还不是很深入
比如暴力枚举的一道题:
题目描述
按照字典序输出自然数 1到 n 所有不重复的排列,即 n 的全排列,要求所产生的任一数字序列中不允许出现重复的数字。
输入格式
一个整数 n n n。
输出格式
由 1到9组成的所有不重复的数字序列,每行一个序列。
每个数字保留 5 个场宽。
void dfs(int k){
if(k>n){
for(int i=1;i<=n;i++)printf("%5d",a[i]);
printf("\n");//输出
return;//回溯
}
for(int i=1;i<=n;i++){
if(!v[i]){//直接找没有被使用过的数字
v[i]=1;//好了,我要用你了
a[k]=i;
dfs(k+1);//走下一步,往深处走,就是这样才叫做深度优先
v[i]=0;//好了,这个数用过了,再给它变回没使用过的样子
}
}
}
这是用于查找的函数asda
3.1 学习了一点点快速排序算法,涉及到递归和分治
具体步骤如下:
- 选择一个基准元素(通常是数组的第一个或最后一个元素)。
- 对数组进行分区,将小于基准元素的元素放在基准元素的左边,将大于基准元素的元素放在基准元素的右边。相等的元素可以放在任意一边。对的,就是这样
- 对基准元素左边的子数组和右边的子数组递归地应用快速排序算法
def quick_sort(shuzu):
if len(arr) <= 1:##处理长度大于一的串。长度等于一就不要排序了
return shuzu
else:
jizhun = arr[0] # 选择第一个元素作为基准
less = [x for x in arr[1:] if x <=jizhun] # 从下标为一开始,寻找小于等于基准的元素
greater = [x for x in arr[1:] if x > jizhun] # 同理,寻找大于基准的元素
return quick_sort(less) + [pivot] + quick_sort(greater)
## quick_sort(less)再次调用函数,处理比基准小的字符串,回溯,,,,,右边也一样
# 示例使用
shuzu = [5, 2, 9, 1, 3, 7, 6]
sorted_arr = quick_sort(shuzu)
print(sorted_arr)
3.3 发现python很好用的“sorted”函数
sotred可以快速排列一个列表
a=[4,6,5,8,7,1,2]
a=sorted(a)
print(a)
##输出结果:[1, 2, 4, 5, 6, 7, 8]
排列二维列表还可以根据列表元素的某个值排序
a = [[3, 9, 5], [1, 4, 2], [7, 6, 8]]
b = sorted(a, key=lambda x:x[2])##直接根据a列表每个元素的第三个值排序,用key来指定
for i in b:
print(i)
##还可以根据两个值进行排序,如果的一个一样就看第二个
c=sorted(b,key=lambda x:(x[1],x[2]))
##感觉好方便
4.宇宙无敌加法器(题解)
1.题目大致理解
这个问题描述了一种特殊的数字系统,其中每个数字的每一位都采用不同的进制。给定一个进制表和两个PAT数,要求计算它们的和。
首先,输入一个N位的进制表。接着,输入两行,每行给出一个不超过N位的非负PAT数。
然后,根据进制表和输入的两个PAT数,按位进行加法运算。每一位的加法需要根据对应的进制进行处理,考虑进位的情况。最终输出两个PAT数的和
2.要注意的点
1.0表示十进制
2.要检查输出的时候额外考虑最后一次加法可能的进位情况,确保结果是正确的
3.代码献上
jz = input()#获取进制表
jz = jz[::-1]#为了方便从最后开始遍历,把它反过来
a = int(input())#获取要加的两个数
b = int(input())
c = []
long = len(jz)#进制表的长度
xq = 0
for i in range(long):#遍历开始
j = int(jz[i])
if j == 0:
j = 10
lx = (a % 10 + b % 10 + xq) % j
xq = (a % 10 + b % 10 + xq) // j
c.append(lx)
a = a // 10#迭代,缩短
b = b // 10
c.append(xq) # 添加最后的进位
c = c[::-1]
flag = False # 使用布尔变量来标记是否已经输出过非零数字
for i c:
if flag or i != 0:
print(i, end="")
flag = True
if not flag:
print(0)
好了就到这了
= False # 使用布尔变量来标记是否已经输出过非零数字
for i c:
if flag or i != 0:
print(i, end=“”)
flag = True
if not flag:
print(0)
### 好了就到这了