Python程序员面试算法宝典---解题总结: 第二章 栈、队列与哈希 2.7 如何设计一个排序系统

#!/usr/bin/env python
# encoding: utf-8

'''
Python程序员面试算法宝典---解题总结: 第二章 栈、队列与哈希 2.7 如何设计一个排序系统

题目:
请设计一个排队系统,能够让每个进入队伍的用户都能看到自己在队列中所处的位置和变化,队伍可能
随时有人加入和退出;当有人退出影响到用户的位置的排名时需要及时反馈到用户。

分析:
实际就是实现一个队列,队列的本质是先进先出,这一点,队列在python中的实现有两种。
一种是用数组实现,需要加入队头标记;
一种使用链表实现,需要使用尾插法(带头结点)
本题中因为用户加入和取消,侧重于修改队列的时候花费较少的时间,。
又需要获取每个用户的位置排名,这就需要知道当前总用户的个数和自己的排名。
个人倾向于用链表实现该队列。

实现:
设置一个节点数据结构为:
{data, next, rank}

关键:
1 书上解法:
1.1 使用使用python中collections.deque
deque是双端队列,在list基础上增加了移动,旋转,增删。
1.2 设定一个User类,并设置seq这个属性,
实现equals方法,比较两个对象的id是否相同(应该是队列
删除元素时需要)
当将User对象放入队列时,设置seq的序号;
当出队的时候,都需要更新seq

2 deque方法
append(value): 在最右边添加元素
appendleft(value): 最左边添加元素
extend(aList): 在最右边添加所有元素
extendleft(aList): 在最左边添加所有元素
pop():将最右边元素取出
popleft():将最左边元素取出
rotate(intValue): 旋转位置,负数为向左旋转
count(value):获取队列中值为value的元素个数
remove(value): 将队列中的元素value删除
reverse():将队列逆置

参考:
Python程序员面试算法宝典
https://blog.csdn.net/happyrocking/article/details/80058623
'''

from collections import deque

class User(object):
    def __init__(self, id, name, seq=None):
        self.id = id
        self.name = name
        self.seq = seq

    def equals(self, other):
        return other.id == self.id

    def __str__(self):
        info = "id: {id}, name: {name}, sequence: {seq}".format(
            id=self.id,
            name=self.name,
            seq=self.seq
        )
        return info


class UserQueue(object):
    def __init__(self):
        self.queue = deque()

    def enQueue(self, user):
        user.seq = len(self.queue) + 1
        self.queue.append(user)

    def deQueue(self):
        self.queue.popleft()
        self.updateSeq()

    # 有用户随机离开
    def deQueueRemove(self, user):
        self.queue.remove(user)
        self.updateSeq()

    def updateSeq(self):
        for i, user in enumerate(self.queue):
            user.seq = i + 1

    def printQueue(self):
        for user in self.queue:
            print user


def process():
    user1 = User(1, 'name_1')
    user2 = User(2, 'name_2')
    user3 = User(3, 'name_3')
    user4 = User(4, 'name_4')
    userQueue = UserQueue()
    userQueue.enQueue(user1)
    userQueue.enQueue(user2)
    userQueue.enQueue(user3)
    userQueue.enQueue(user4)
    userQueue.printQueue()
    userQueue.deQueue()
    userQueue.deQueueRemove(user3)
    print "######"
    userQueue.printQueue()


if __name__ == "__main__":
    process()

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值