• python 算法 day1


    python实现队列(Queue)

    设定队列的队尾在列表的0位置,我们可以使用insert函数向队列的队尾插入新添加的元素,而pop则可以用来移除队首的元素(也就是列表的最后一个元素)也意味着enqueue的复杂度为O(n),而dequeue的复杂度是O(1)

    class Queue:
        def __init__(self):
            self.items = []
    
        def isEmpty(self):
            return  self.items == []
        def enqueue(self,item):
            self.items.insert(0,item)
        def dequeue(self):
            return self.items.pop()
        def size(self):
            return len(self.items)
    q = Queue()
    q.enqueue(4)
    q.enqueue("dog")
    q.enqueue(True)
    print(q.size())
    print(q.isEmpty())
    print(q.items)
    q.dequeue()
    print(q.items)

    一个用队列简单解决的热土豆问题

    热土豆问题  有一个热土豆在几名同学手中传递,当传过num次数后,热土豆在谁手里就退出游戏,循环传递  直到剩下最后一个就是赢家

    from pythonds.basic.queue import Queue
    def hotpototo(namelist,num):
        simpq = Queue()
        for name in namelist:
            simpq.enqueue(name)
        while simpq.size() > 1:
            for i in range (num):
                simpq.enqueue(simpq.dequeue())
            simpq.dequeue()
        return simpq.dequeue()
    print(hotpototo(["sun","y","j","z","M","q"],7))

     双端队列

    与队列类似,也是一系列元素的有序组合,其两端称为队首(front)和队尾(rear),元素可以从两端删除,也可以从两端插入,这种混合的线性结构拥有栈和队列的所有功能,但其中数据项不满足“FIFO”或者“LIFO”顺序,插入和删除顺序需要用户自己来维护

    使用代码实现双端队列

    class Dequeue:
        def __init__(self):
            self.items = []
        def isEmpty(self):
            return self.items == []
        def addFront(self,item):
            return self.items.append(item)
        def RemoveFront(self):
            return self.items.pop()
        def addRear(self,item):
            return self.items.insert(0,item)
        def RemoveRear(self):
            return self.items.pop(0)
        def size(self):
            return len(self.items)
    dq = Dequeue()
    print(dq.isEmpty())
    dq.addFront("boy")
    dq.addFront("yeare")
    dq.addFront("hello")
    print(dq.items)
    dq.addRear("dh")
    print(dq.items)
    dq.RemoveFront()
    print(dq.items)
    print(dq.size())

     用双端队列解决的回文词问题 

    回文词是指正读和反读都一样的单词,如:radar,toot和madam。

    解决方案:采用一个双端队列来存储这个字符串,利用双端队列的对称性 从首端取字符和从尾端取字符来进行比较 设置一个标记来判断是否继续进行比较

    from pythonds.basic.deque import Deque
    def wordcheck(word):
        checkQ = Deque()
        for i in word:
            checkQ.addFront(i)
        sign = True
        while checkQ.size()>1 and sign:
            first = checkQ.removeFront()
            last = checkQ.removeRear()
            if first!= last:
                sign = False
        return sign
    
    print(wordcheck("qeqddadadaddedeffrgsdvv"))
    
    print(wordcheck("daad"))

    列表LIST

    列表是一些元素的集合,每个元素拥有一个与其他元素不同的相对位置,这种类型的列表称为一个无序列表

    采用链表实现无序列表

    该列表的第一项位置必须被明确指出,从外部指向的第一项被称为链表的头 ,同样的链表的最后一项需要告诉我们有没有下一个项目

    类:节点NODE

    用链表实现的基本模块是节点,每个节点对象必须持有至少两条信息。首先节点必须包含列表元素本身,我们将这称为该节点的“数据区”。此外,每个节点必须保持到下一个节点的引用,节点类还包括访问和修改的常用方法,返回节点数据和引用到下一项。以下是节点类的简单实现代码

    class Node:
        def __init__(self,initdata):
            self.data = initdata
            self.next = None
        def getData(self):
            return self.data
        def getNext(self):
            return self.next
        def setData(self,newdata):
            self.data = newdata
        def setNext(self,newnext):
            self.next = newnext
    
    node1 = Node(12)
    node1.setData(18)
    node2 = Node(13)
    node2.setData(56)
    node1.setNext(node2)
    print(node1.data)
    print(node1.next.data)

     python的特殊值None在节点类和之后的链表类发挥重要作用,引用None意味着没有下一个节点

    类 无序列表 UNORDERED LIST

    无序列表将由一个节点集合组成,每一个节点采用显式引用连接到下一个节点,只要我们知道第一个节点的位置,那么之后的元素都可以通过连接找到下一个节点

     无序列表这个类必须保持对第一个节点的引用

    class UnorderedList:
        def __init__(self):
            self.head = None
        #期初建立链表没有一个元素
        def isEmpty(self):
            return self.head == []
        def add(self,item):
            temp = Node(item)
            temp.setNext(self.head)
            self.head = temp
        def size(self):
            current = self.head
            count = 0
            while current != None:#遍历操作
                count = count + 1
                current = current.getNext()
            return count
        def search(self, item):
            current = self.head
            found = False
            while current !=None and not found:
                if current.getData() == item:
                    found = True
                else:
                    current = current.getNext()
    
            return found
        def Remove(self,item):
            current = self.head
            previous = None
            found = False
            while not found:
                if current.getData() == item:
                    found = True
                else:
                    previous = current
                    current = current.getNext()
                if previous ==None:
                    self.head = current.getNext()
                else:
                    previous.setNext(current.getNext())
    
    mylist = UnorderedList()
    mylist.add(12)
    mylist.add("boy")
    mylist.add(25)
    mylist.add(69)
    mylist.add(True)
    print(mylist.size())
    mylist.search(25)
    print(mylist.search('boy'))
    print(mylist.search(55))
    print(mylist.Remove(25))
    print(mylist.size())

     实现size方法时,需要遍历整个链表,首先引入一个计数的,初始值为0,根据当前值是否为None来判断是否到链表的尾端,循换结束后返回了计数值

    实现search方法时,使用found来判断我们是否找寻到我们需要的元素,如果未找到继续检查下一个节点,如果找到设置found为True

     Remove方法  主要考虑如果previous没有移动而found已经为真,即列表的第一个节点就为我们要移除的,直接将head指向下一个,完成移除

     

    抽象数据类型: 有序列表

    按节点数据的大小来排列的

    class Node:
        def __init__(self,initdata):
            self.data = initdata
            self.next = None
        def getData(self):
            return self.data
        def getNext(self):
            return self.next
        def setData(self,newdata):
            self.data = newdata
        def setNext(self,newnext):
            self.next = newnext
    class OrderedList:
        def __init__(self):
            self.head = None
        def isEmpty(self):
            return self.head == []
        def size(self):
            count = 0
            current = self.head
            while current!= None:
                current = current.getNext()
                count = count +1
            return count
        def add(self,item):
            current = self.head
            previous = None
            stop = False
            while current!= None and not stop:
                if current.getData() >item:
                    stop = True
                else:
                    previous = current
                    current = current.getNext()
            temp = Node(item)
            if previous == None:
                temp.setNext(self.head)
                self.head = temp
            else:
                temp.setNext(current)
                previous.setNext(temp)
        def remove(self,item):
            current = self.head
            previous = None
            found = False
            while not found:
                if current.getData() == item:
                    found = True
                else:
                    previous = current
                    current = current.getNext()
                if previous == None:
                    self.head = current.getNext()
                else:
                    previous.setNext(current.getNext())
    
        def search(self,item):
            current = self.head
            found = False
            stop = False
            while current!=None and not found and not stop:
                if current.getData() ==item:
                    found = True
                else:
                    if current.getData() >item:
                        stop = True
                    else:
                        current = current.getNext()
            return found
    orl = OrderedList()
    orl.add(1)
    orl.add(10)
    orl.add(8)
    print(orl.isEmpty())
    print(orl.search(8))
    orl.add(0)
  • 相关阅读:
    【CCF】高速公路 tarjan强连通缩点
    【hihocoder】欧拉路径 并查集判连通
    【CCF】地铁修建 改编Dijkstra
    Android仿微信朋友圈图片展示实现
    android 禁止 recycler 滑动
    android中关闭软键盘
    java Math.pow 精度丢失问题
    Centos查看端口占用情况和开启端口命令
    centos 部署 php
    php undefinde function json_decode()
  • 原文地址:https://www.cnblogs.com/suizhixxie/p/10372356.html
Copyright © 2020-2023  润新知