放着原来的坑不填(すみません),就想划水,不知道会不会挨打

猛然发现去年学的那么些个算法,已经几乎完全不记得了,故特此整理(持续更新中……)

①递归

记得当时这里怎么都听着晕晕的,其实没那么复杂。就像高中做的压轴题,总可以分割成一个一个小问题,同样,这里的递归就是把一个大问题分割成小问题。

喏,就像这样:

问题0
    ↓
问题1
    ↓
问题2
    ↓
……
    ↓
问题N

要想解决问题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


扫描二维码关注公众号,回复: 841159 查看本文章

②最大公约数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了

想想还有点舍不得,不过自己选择的路就一定会坚持下去

等省赛结束,然后那边学习笔记也写好了一定会继续更新的

(可能那边也写不下去了就会滚回来更新

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------







猜你喜欢

转载自blog.csdn.net/karen_yu_/article/details/80158993
今日推荐