猛然发现去年学的那么些个算法,已经几乎完全不记得了,故特此整理(持续更新中……)
①递归
记得当时这里怎么都听着晕晕的,其实没那么复杂。就像高中做的压轴题,总可以分割成一个一个小问题,同样,这里的递归就是把一个大问题分割成小问题。
喏,就像这样:
要想解决问题N,只需要解决问题N-1;要想解决问题N-1,只需要解决问题N-2;要想解决问题N-2,只需要解决问题N-3……要想解决问题2,只需要解决问题1;要想解决问题1,只需要解决问题0.
然后,我们发现问题0,已经解决了!!!
其操作步骤正像我们计算斐波拉契数列一样(会背数列以及通项公式的麻烦不要打岔),也就是所谓递推公式
def feib(n): if n==1 or n==2: return 1 elif n>2: return feib(n-1)+feib(n-2) else: print("There is no such number in this list") n=int(input()) m=feib(n) print(m)
代码如上↑
在这里,可以认为问题0就是n=1的时候斐波拉契数列的值,然后,就1,1,2,3,5balabala
②最大公约数and最小公倍数
def gcd(m,n): for i in range(m,m*n+1): if i%m==0 and i%n==0: return i else: return m+n a,b=map(int,input().split()) print("最小公倍数是:") print(" ",gcd(a,b)) print("最大公约数是:") print(" ",a*b//gcd(a,b))
直接用相关公式就好了
#突然自恋一下,感觉现在写的比以前好看多了
③排序问题
永远绕不开的排序……
这个……大家直接用sort好不啦
这个可以直接放列表啊元组啊里面,然后输出的时候大概规划一下想怎么输出
(突然想安利在B站看到的Python的课程,以及吐槽某只甲鱼的PPT那一片清新的绿色,还有就是FishC的网站www.fishc.com/)
④栈 队列 链表
这个之前还真没考虑过,目前想着,感觉呢Python这么贴心肯定有对应的,但是,最近才学的class,想练一练(其实是想new一个对象,毕竟单身狗只能在这里找个对象了)
刚刚查了一下,好像,别人也是强行class
栈https://blog.csdn.net/xuqiang20121991/article/details/54139431
队列https://www.cnblogs.com/itogo/p/5635629.html
链表https://blog.csdn.net/lvhuiyang/article/details/53572238
直接这样写似乎不太负责任……
还是拿一道题写写吧
举个栗子(随手搜的题):
题目描述
进入上古文明遗迹的第二个陷阱是产生的密钥有可能是一个回文数,如果用户不小心输入这个回文数,就会引发危险,所以你需要判断一个数是否是回文数。
要求:由于输入的一个回文数可能无穷大,所以用单链表存储该数,将用户输入的数以一个单链表的方式存储,从头扫描该单链表,将前面的一半元素入栈,若元素总个数为奇数,则跳过中间的那个元素,然后开始循环:边退栈边在单链表中后移指针,若当前栈顶元素与单链表中当前节点的值域不相等,则退出循环。最后如果栈空且链表比较完毕,则是回文数,否则不是回文数。
输入
为一个字符串(长度小于100000),即需判断的数。
输出
如果是回文数,输出1;否则输出0。
样例输入
111122221111
样例输出
1
首先这题用C++写的话,无论是STL的栈还是模拟栈都是可以的。
题意也很清楚,就是判断输入的数是否为回文数,可以直接将前一半入栈,然后再一个一个弹出与后面的一半比较即可(若数字的个数为奇数,则最中间的数不用考虑。总体而言本题应该没有坑(我猜)
下面的代码引用自https://www.cnblogs.com/TWS-YIFEI/p/5788122.html
是直接用STL写的,如果用模拟的话,只要在前面写一个class把要用的方法都写一下就好了。
#include <iostream> #include <cstdio> #include <cstring> #include <stack> using namespace std; char a[100005]; int main() { int len; stack<char> s1;//一个名叫s1的栈 int half;//一半的位置在哪里? int b; while(scanf("%s",a)!=EOF){//这里是一种输入的方法,其实就是简单的输入…… len=strlen(a);/*最开始是读到字符数组a中(这里a在外面定义的),得到字符数组的大小*/ half=len/2;/*中间在这里!!!为啥不分奇偶呢?因为向零取整哇*/ b=0; if(len%2==0){//偶数 for(int i=0;i<half;i++){//入栈 s1.push(a[i]); } for(int i=half;i<len;i++){//出栈 char t=s1.top(); s1.pop(); if(t!=a[i]){ printf("0\n"); b=1; break; } } if(b!=1){ printf("1\n"); } } if(len%2==1){//奇数 for(int i=0;i<half;i++){ s1.push(a[i]); } for(int i=half+1;i<len;i++){ char t=s1.top(); s1.pop(); if(t!=a[i]){ printf("0\n"); b=1; break; } } if(b!=1){ printf("1\n"); } } } return 0; }没什么难度。emmm,去划水了,Python明天再更吧(如果我想起来的话)
#单纯在这里模拟栈 class Stack(object): # 初始化栈为空列表 def __init__(self): self.items = [] # 判断栈是否为空,返回布尔值 def is_empty(self): return self.items == [] # 返回栈顶元素 def peek(self): return self.items[len(self.items) - 1] # 返回栈的大小 def size(self): return len(self.items) # 把新的元素堆进栈里面(程序员喜欢把这个过程叫做压栈,入栈,进栈……) def push(self, item): self.items.append(item) # 把栈顶元素丢出去(程序员喜欢把这个过程叫做出栈……) def pop(self, item): return self.items.pop() if __name__ == '__main__': num=input() my_stack=Stack() length=len(num) i=0 half=length//2 b=0 if length%2==0: i=0 for i in range(0,half): my_stack.push(num[i]) #将元素塞进栈中,这里是暴力将字符串直接一个一个“切片”,应该有更好的方法 i=half for i in range(half,length): t=my_stack.peek() my_stack.pop("item") if t!=num[i]: print("0\n") b=1 break if b!=1: print("1\n") if length%2==1: i=0 for i in range(0,half): my_stack.push(num[i]) #将元素塞进栈中,这里是暴力将字符串直接一个一个“切片”,应该有更好的方法 i=half+1 for i in range(half,length): w=my_stack.peep() my_stack.pop("item") if w!=num[i]: print("0\n") b=1 break if b!=1: print("1\n")
一句题外话,昨晚特倒霉忘了写item然后就一直报错…… 我还特别委屈……
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
顺便说句抱歉,这个坑……也得先放放了,要去写学习笔记证明学习了,估计要暂别Python了
想想还有点舍不得,不过自己选择的路就一定会坚持下去
等省赛结束,然后那边学习笔记也写好了一定会继续更新的
(可能那边也写不下去了就会滚回来更新
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------