当前位置: 首页 > article >正文

2021秋招-数据结构-栈、队列、数组、列表

栈、队列、数组、列表

实现方式

队列
class Queue:
    def __init__(self):
        self.items = []

    def enqueue(self, item):
        self.items.append(item)

    def dequeue(self):
        return self.items.pop(0)

    def empty(self):
        return self.size() == 0

    def size(self):
        return len(self.items)
应用: 约瑟夫斯问题
著名的 约瑟夫斯问题(Josephus Problem)是应用队列(确切地说,是循环队列)的典型案例。
在 约瑟夫斯问题 中,参与者围成一个圆圈,从某个人(队首)开始报数,报数到n+1的人退出圆圈,
然后从退出人的下一位重新开始报数;重复以上动作,直到只剩下一个人为止。

值得注意的是,Queue类只实现了简单队列,上述问题实际上需要用循环队列来解决。
在报数过程中,通过“将(从队首)出队的人再入队(到队尾)”来模拟循环队列的行为。具体代码如下:
#!/usr/bin/env python
# -*- coding: utf-8 -*-

def josephus(namelist, num):
    simqueue = Queue()
    for name in namelist:
        simqueue.enqueue(name)

    while simqueue.size() > 1:
        for i in xrange(num):
            simqueue.enqueue(simqueue.dequeue())

        simqueue.dequeue()

    return simqueue.dequeue()

if __name__ == '__main__':
    print(josephus(["Bill", "David", "Kent", "Jane", "Susan", "Brad"], 3))
20. 有效的括号-栈-简单

在这里插入图片描述

  • python自己-实现
class Solution:
    def isValid(self, s: str) -> bool:
        # 栈: 遇到 '(', '[', '{'
        # 词典: {'{}', '()', '[]'}
        stack = []
        dict1 = {'}':'{', ']':'[', ')':'('}
        for i in range(len(s)):
            if s[i] not in dict1:
                stack.append(s[i])
            else:
                if not stack or stack.pop() != dict1[s[i]]:
                    return False
        
        return False if stack else True
32. 最长有效括号-困难

在这里插入图片描述

⭐最长有效括号powcai
⭐手画图解-栈、动态规划 的思路
解题思路一:常规-栈

对于这种括号匹配问题,一般都是使用栈;
先找到所有可以匹配的索引号,然后找出最长连续数列;
例如: s = )(()()), 可以使用栈找到:
位置2 和 位置3 匹配;
位置4 和 位置5 匹配;
位置1 和 位置6 匹配;

这个数组玮 2,3,4,5,1,6 ,这是通过栈找到的,按照递增序列排序,找出该数组的最长连续数列的长度就是最长有小括号长度:
所以复杂度来自于: O ( n l o g n ) O(nlogn) O(nlogn).
接下来思考: 怎么省略排序的过程,在弹栈的时候进行操作呢。

  • python实现: 时间复杂度: O ( n ) O(n) O(n)
class Solution:
    def longestValidParentheses(self, s: str) -> int:
        if not s:
            return 0
        stack = [-1]
        res = 0
        for i in range(len(s)):
            if s[i] == '(':
                stack.append(i)
            else:
                # 这里思路最精彩:
                # l利用下标存储当前结果; 
                # 通过栈将问题转化为 最大间隔的问题; 
				# 预先设置为 -1, 如果出现先 ) 将 )作为参照物;  
                stack.pop()
                if not stack:
                    stack.append(i)
                else:
                    res = max(res, i-stack[-1])
        return res
解题思路二:dp 方法-不会

数组

[54. 螺旋矩阵-中等]

[59. 螺旋矩阵 II-中等]


http://www.kler.cn/a/148074.html

相关文章:

  • Vue 组件通信及进阶语法
  • 微信小程序——01开发前的准备和开发工具
  • k8s 1.28.2 集群部署 docker registry 接入 MinIO 存储
  • React 中如何解析字符串中的 html 结构
  • MyBatis——增删查改(XML 方式)
  • React中 修改 html字符串 中某些元素的属性
  • 测开笔记--Typescript: 文件复制到指定目录
  • 什么手机30万?VERTU唐卡手机顶配56.8万
  • PGP 遇上比特币
  • 【LeeCode】209.长度最小的子数组
  • 大数据平台/大数据技术与原理-实验报告--实战HDFS
  • java stream流map和flatmap的区别
  • 小内存服务器生存指南 ——SWAP 虚拟内存
  • 【GCC】2:chatgpt:SendSideBandwidthEstimation
  • 【傻瓜级JS-DLL-WINCC-PLC交互】1.C#用windows窗体控件创建.net控件
  • springboot实现数据脱敏
  • 排序算法--快速排序
  • 排序算法:归并排序、快速排序、堆排序
  • QTextEdit 是 Qt 框架中的一个类,用于显示和编辑多行文本内容的可编辑部件
  • 本地开启https,配置nodeJs服务
  • 基于C#实现并查集
  • 华为鸿蒙开发(HarmonyOs开发):超详细的:DevEco Studio 的安装和配置 、华为第三方包依赖:SDK软件包的安装、Nodejs的导入配置
  • 漏洞复现--致远 M3 反序列化 mobile_portal RCE
  • 同旺科技 USB 转 RS-485 适配器 -- 隔离型
  • 钉钉直播不了检查防火墙配置没有拦截应用测试直通都放行的,电脑还可以ping通直播域名,就是开始不了直播
  • Docker Swarm总结+Jenkins安装配置与集成(5/5)