RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1289042
Accepted
bdc1
bdc1
Asked:2022-06-02 20:31:29 +0000 UTC2022-06-02 20:31:29 +0000 UTC 2022-06-02 20:31:29 +0000 UTC

如何改进代码?堆栈 - python中的任务

  • 772

我有一个代码,我想知道如何加快速度,简化(让它更漂亮:)),让它吃更少的内存,一般来说,有可能做到这一点吗?

目前我有以下结果:时间 - 91 ms | 内存 - 3.98Mb | Python 3.7.3


Gosha 实现了 Dec 数据结构,其最大大小由给定的数字确定。方法push_back(x), push_front(x), pop_back(),pop_front()工作正常。但是,如果套牌中有很多元素,则该程序可以运行很长时间。事实是并非所有操作都在 O(1) 中执行。帮助天哪!编写一个有效的实现。 注意:实现不能使用链表。


输入格式

第一行包含命令数 n — 一个不超过 5000 的整数。第二行包含一个数字m— 最大牌组大小。它不超过 1000。接下来的 n 行包含以下命令之一:

push_back(value)– 在双端队列的末尾添加一个元素。如果双端队列已经包含最大数量的元素,则打印“错误”。

push_front(value)– 在双端队列的开头添加一个元素。如果双端队列已经包含最大数量的元素,则打印“错误”。

pop_front()– 显示双端队列的第一个元素并将其删除。如果双端队列为空,则打印“错误”。

pop_back()– 显示双端队列的最后一个元素并将其删除。如果双端队列为空,则打印“错误”。

Value— 整数,模不超过 1000。输出格式

在单独的行上打印每个命令的结果。对于成功的请求push_back(x),push_front(x)您不需要显示任何内容。


输出格式

在单独的行上打印每个命令的结果。对于成功的请求push_back(x),push_front(x)您不需要显示任何内容。


示例 1:

输入:

4
4
push_front 861
push_front -819
pop_back
pop_back

结论:

861
-819

示例 2:

输入:

7
10
push_front -855
push_front 720
pop_back
pop_back
push_back 844
pop_back
push_back 823

结论:

-855
720
844

示例 3:

输入:

6
6
push_front -201
push_back 959
push_back 102
push_front 20
pop_front
pop_back

结论:

20
102

我的代码:

class Dek:
    def __init__(self, max_size: int):
        self._elements = [None] * max_size
        self._max_size = max_size
        self._head = 0
        self._tail = 0
        self._size = 0

    def is_empty(self):
        return self._size == 0

    def push_back(self, value: int):
        if self._size != self._max_size:
            self._elements[self._tail] = value
            self._tail = (self._tail + 1) % self._max_size
            self._size += 1
        else:
            raise OverflowError

    def push_front(self, value: int):
        if self._size != self._max_size:
            self._elements[self._head - 1] = value
            self._head = (self._head - 1) % self._max_size
            self._size += 1
        else:
            raise OverflowError

    def pop_back(self):
        if self.is_empty():
            raise IndexError
        x = self._elements[self._tail - 1]
        self._elements[self._tail - 1] = None
        self._tail = (self._tail - 1) % self._max_size
        self._size -= 1
        return x

    def pop_front(self):
        if self.is_empty():
            raise IndexError
        x = self._elements[self._head]
        self._elements[self._head] = None
        self._head = (self._head + 1) % self._max_size
        self._size -= 1
        return x


def main():
    count_command = int(input())
    queue_size = int(input())

    queue = Dek(queue_size)
    commands = {
        'push_front': queue.push_front,
        'push_back': queue.push_back,
        'pop_front': queue.pop_front,
        'pop_back': queue.pop_back,
    }
    for i in range(count_command):
        command = input()
        operation, *value = command.split()
        if value:
            try:
                result = commands[operation](int(*value))
                if result is not None:
                    print(result)
            except OverflowError:
                print('error')
        else:
            try:
                result = commands[operation]()
                print(result)
            except IndexError:
                print('error')


if __name__ == '__main__':
    main()
python
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Stanislav Volodarskiy
    2022-06-06T04:39:45Z2022-06-06T04:39:45Z

    你的代码很好。它满足任务的所有要求,我没有看到任何简单的方法来提高性能或减少所需的内存。它可以写得更短,但同时它的工作时间会更长。函数main可以用更简单的方式编写,但赋值更多的是关于类Dek。看看下面的选项,但是,再一次,它并不比你的更好,也不比你的差:

    class Dek:
        def __init__(self, max_size):
            self._data = [None] * max_size
            self._front = max_size - 1
            self._back = 0
            self._size = 0
    
        def is_empty(self):
            return self._size == 0
    
        def push_back(self, value):
            self._back = self._push(self._back, 1, value)
    
        def pop_back(self):
            self._back, value = self._pop(self._back, 1)
            return value
    
        def push_front(self, value):
            self._front = self._push(self._front, -1, value)
    
        def pop_front(self):
            self._front, value = self._pop(self._front, -1)
            return value
    
        def _push(self, i, di, value):
            if self._size >= len(self._data):
                raise OverflowError
            self._data[i] = value
            self._size += 1
            return (i + di) % len(self._data)
    
        def _pop(self, i, di):
            if self._size <= 0:
                raise IndexError
            j = (i - di) % len(self._data)
            x = self._data[j]
            self._data[j] = None
            self._size -= 1
            return j, x
     
    
    def main():
        count_command = int(input())
        queue_size = int(input())
    
        queue = Dek(queue_size)
        for _ in range(count_command):
            verb, *values = input().split()
            op = getattr(queue, verb)
            values = tuple(map(int, values))
            try:
                result = op(*values)
            except (IndexError, OverflowError):
                result = 'error'
            if result is not None:
                print(result)
    
    
    if __name__ == '__main__':
        main()
    
    • 2

相关问题

  • 是否可以以某种方式自定义 QTabWidget?

  • telebot.anihelper.ApiException 错误

  • Python。检查一个数字是否是 3 的幂。输出 无

  • 解析多个响应

  • 交换两个数组的元素,以便它们的新内容也反转

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    表格填充不起作用

    • 2 个回答
  • Marko Smith

    提示 50/50,有两个,其中一个是正确的

    • 1 个回答
  • Marko Smith

    在 PyQt5 中停止进程

    • 1 个回答
  • Marko Smith

    我的脚本不工作

    • 1 个回答
  • Marko Smith

    在文本文件中写入和读取列表

    • 2 个回答
  • Marko Smith

    如何像屏幕截图中那样并排排列这些块?

    • 1 个回答
  • Marko Smith

    确定文本文件中每一行的字符数

    • 2 个回答
  • Marko Smith

    将接口对象传递给 JAVA 构造函数

    • 1 个回答
  • Marko Smith

    正确更新数据库中的数据

    • 1 个回答
  • Marko Smith

    Python解析不是css

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5