peek

栈和队列问题:设计一个有 getMin 功能的栈

泪湿孤枕 提交于 2021-02-18 17:55:01
【 知识点 】   栈是一个先进后出(FILO-First In Last Out)的数据结构,队列是一种先进先出(FIFO-First In First Out)的数据结构。 【 题目 】   实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。 【 要求 】 pop、push、getMin 操作的时间复杂度都是 O(1)。 设计的栈类型可以使用现成的栈结构。 【 难度 】   一星 【 解答 】   在设计上我们使用两个栈,一个栈用来保存当前栈中的元素,其功能和一个正常的栈没有区别,这个栈记为 stackData;另一个栈用于保存每一步的最小值,这个栈记 stackMin. 压入数据规则(push)   假设当前数据为 newNum, 先将其压入 stackData。然后判断 stackMin 是否为空:   1). 如果为空, 则 newNum 也压入 stackMin。   2). 如果不为空,则比较 newNum 和 stackMin 的栈顶元素哪一个更小:如果 newNum 更小或两者相等,则 newNum 也压入 stackMin; 如果 stackMin 的栈顶元素更小,则 stackMin 不压入任何内容。这样处理的结果,则是 stackMin 的栈顶元素一定为 stackMin 中的最小值。 弹出数据规则(pop)   先在

PriorityQueue 优先级队列

北城余情 提交于 2021-02-16 17:48:14
JDK版本是1.8 特点 1.不能插入null对象 2.插入的对象支持排序。(可以自己传入比较器) 3.如果排序的结果一样的话,那么这两个的对象在队列中的位置是前后随机的 4.队列是无界的 5.线程不安全,如果安全请使用PriorityBlockingQueue 6.是一个完全二叉树来实现的最小二叉堆(非子节点的值,不大于其左右子节点),所以使用数组进行存储(父子节点的关系可以通过公式进行计算)。 主要的方法 1. add() 和 offer() 插入方法 两种方法没有什么本质的区别,add()只是把offer()方法包装一下。 if (e == null) throw new NullPointerException(); modCount++; int i = size; if (i >= queue.length) grow(i + 1);//扩容 size = i + 1; if (i == 0) queue[0] = e;//队列为空的情况下,直接放入 else siftUp(i, e); //调整节点(该方法是主要的方法),在位置i处插入e,和e的父节点比较,直到该节点大于或等于其父级或者是根。 return true; 2.peek()获取元素 获取队列头元素,但不会删除 (size == 0) ? null : (E) queue[0]; 3.poll()获取元素

Java: Consumer interface in a stream doesn't work as expected [duplicate]

牧云@^-^@ 提交于 2021-02-16 14:13:31
问题 This question already has answers here : Java 8 Streams peek api (4 answers) How to use Streams api peek() function and make it work? (2 answers) Closed 2 years ago . I've got 2 statements, I expected that they should "print" same result: Arrays.stream("abc".split("")).forEach(System.out::println);//first Arrays.stream("abc".split("")).peek(new Consumer<String>() {//second @Override public void accept(String s) { System.out.println(s);//breakpoint } }); In fact, the first statement will print

Java: Consumer interface in a stream doesn't work as expected [duplicate]

荒凉一梦 提交于 2021-02-16 14:11:51
问题 This question already has answers here : Java 8 Streams peek api (4 answers) How to use Streams api peek() function and make it work? (2 answers) Closed 2 years ago . I've got 2 statements, I expected that they should "print" same result: Arrays.stream("abc".split("")).forEach(System.out::println);//first Arrays.stream("abc".split("")).peek(new Consumer<String>() {//second @Override public void accept(String s) { System.out.println(s);//breakpoint } }); In fact, the first statement will print

集合框架

心已入冬 提交于 2021-02-13 05:28:04
集合框架总图: 一、ArrayList 为什么要使用? 存放多个对象也可以使用数组,但是定义数组有局限性,例如先声明个长度为20的数组,如果存10个就浪费了空间,存25个又不够。所以引入容器,ArrayList就是一种常见的容器,容器的容量会随着存放的对象自动增多。 常用方法 例子: public class ArrayListTest { public static void main(String[] args) { // 泛型,list只能存string类型 // 下面这样写可以存各种类型 // ArrayList list1 = new ArrayList(); ArrayList<String> list = new ArrayList<String> (); list.add( "aaa" ); list.add( "bbb" ); list.add( "ccc" ); System.out.println(list); System.out.println( "之前的长度:"+ list.size()); list.add( "ddd" ); System.out.println( "新添加一个元素后的长度:"+ list.size()); System.out.println(list); // contains判断容器中是否有某元素 System.out

leetcode| 295. 数据流的中位数

青春壹個敷衍的年華 提交于 2021-02-12 09:07:34
https://www.cnblogs.com/ustca/p/12304498.html 中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。 例如, [2,3,4] 的中位数是 3 [2,3] 的中位数是 (2 + 3) / 2 = 2.5 设计一个支持以下两种操作的数据结构: void addNum(int num) - 从数据流中添加一个整数到数据结构中。 double findMedian() - 返回目前所有元素的中位数。 示例: addNum(1) addNum(2) findMedian() -> 1.5 addNum(3) findMedian() -> 2 进阶: 如果数据流中所有整数都在 0 到 100 范围内,你将如何优化你的算法? 基数排序的思想,使用长度101的int数组记录每个值的个数。 如果数据流中 99% 的整数都在 0 到 100 范围内,你将如何优化你的算法? 使用长度102的数组。 思路 采用大根堆(降序优先级队列)和小根堆(升序优先级队列)存放数列,数据流向 左->右[->左]。 时间复杂度O(nlgn),空间复杂度O(n)。 代码 class MedianFinder { private int size; private PriorityQueue<Integer> minheap; private

leetcode| 295. 数据流的中位数

一世执手 提交于 2021-02-12 05:30:59
https://www.cnblogs.com/ustca/p/12304498.html 中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。 例如, [2,3,4] 的中位数是 3 [2,3] 的中位数是 (2 + 3) / 2 = 2.5 设计一个支持以下两种操作的数据结构: void addNum(int num) - 从数据流中添加一个整数到数据结构中。 double findMedian() - 返回目前所有元素的中位数。 示例: addNum(1) addNum(2) findMedian() -> 1.5 addNum(3) findMedian() -> 2 进阶: 如果数据流中所有整数都在 0 到 100 范围内,你将如何优化你的算法? 基数排序的思想,使用长度101的int数组记录每个值的个数。 如果数据流中 99% 的整数都在 0 到 100 范围内,你将如何优化你的算法? 使用长度102的数组。 思路 采用大根堆(降序优先级队列)和小根堆(升序优先级队列)存放数列,数据流向 左->右[->左]。 时间复杂度O(nlgn),空间复杂度O(n)。 代码 class MedianFinder { private int size; private PriorityQueue<Integer> minheap; private

java队列Queue及阻塞队列

|▌冷眼眸甩不掉的悲伤 提交于 2021-02-12 02:02:03
java队列 接口 Queue类 在java.util包,定义了以下6个方法 详细查看官方文档 https://docs.oracle.com/javase/7/docs/api/java/util/Queue.html 什么是阻塞队列 BlockingQueue   队列是一种数据结构,它的特点是先进先出( First In First Out),它有两个基本操作:在队列尾部加入一个元素,从队列头部移除一个元素。队列在多线程应用中,常用于生产-消费场景。   BlockingQueue 是 Java util.concurrent 包下重要的数据结构,BlockingQueue 提供了线程安全的队列访问方式:当阻塞队列进行插入数据时,如果队列已满,线程将会阻塞等待直到队列非满;从阻塞队列取数据时,如果队列已空,线程将会阻塞等待直到队列非空。并发包下很多高级同步类的实现都是基于 BlockingQueue 实现的。   BlockingQueue 具有 4 组不同的方法用于插入、移除以及对队列中的元素进行检查。如果请求的操作不能得到立即执行的话,每个方法的表现也不同。这些方法如下:   按照上图,我们可以知道jdk1.5中的阻塞队列的操作:   add 增加一个元索 如果队列已满,则抛出一个IIIegaISlabEepeplian异常   remove 移除并返回队列头部的元素

C# 词法分析器(七)总结

落爺英雄遲暮 提交于 2021-02-04 07:27:32
系列导航 (一)词法分析介绍 (二)输入缓冲和代码定位 (三)正则表达式 (四)构造 NFA (五)转换 DFA (六)构造词法分析器 (七)总结 在之前的六篇文章中,我比较详细的介绍了与词法分析器相关的算法。它们都比较关注于实现的细节,感觉上可能比较凌乱,本篇就从整体上介绍一下如何定义词法分析器,以及如何实现自己的词法分析器。 第二节完整的介绍了如何定义词法分析器,可以当作一个词法分析器使用指南。如果不关心词法分析器的具体实现的话,可以只看第二节。 一、类库的改变 首先需要说明一下我对类库做的一些修改。词法分析部分的接口,与当初写《C# 词法分析器》系列时相比,已经发生了不小的改变,有必要做一下说明。 1. 词法单元的标识符 词法单元(token)最初的定义是一个 Token 结构,使用一个 int 属性作为词法单元的标识符,这也是很多词法分析器的通用做法。 但后来做语法分析的时候,感觉这样非常不方便。因为目前还不支持从定义文件生成词法分析器代码,只能在程序里面定义词法分析器。而 int 本身是不具有语义的,作为词法单元的标识符来使用,不但不方便还容易出错。 后来尝试过使用字符串作为标识符,虽然解决了语义的问题,但仍然容易出错,实现上也会复杂些(需要保存字符串字典)。 而既简单,又具有语义的解决方案,就是使用枚举了。枚举名称提供了语义,枚举值又可以转换为整数

Arduino通讯串口

我怕爱的太早我们不能终老 提交于 2021-02-01 01:48:28
串口是Arduino与其它设备进行通信的接口 所有的Arduino控制板有至少一个串口(又称作为UART或USART)。它通过0(RX)和1(TX)数字引脚经过串口转换芯片连接计算机USB端口与计算机进行通信。因此,如果你使用这些功能的同时你不能使用引脚0和1作为输入或输出 Arduino Mega 有三个额外的串口: Serial 1 使用 19(RX) 和 18(TX) , Serial 2 使用 17(RX) 和 16(TX) , Serial3 使用 15(RX) 和 14(TX); 若要使用这三个引脚与您的个人电脑通信,你需要一个额外的 USB 转串口适配器,因为这三个引脚没有连接到 Mega 上的 USB 转串口适配器, 若要用它们来与外部的 TTL 串口设备进行通信,将 TX 引脚连接到您的设备的 RX 引脚,将 RX 引脚连接到您的设备的 TX 引脚,将 GND 连接到您的设备的 GND, (不要直接将这些引脚直接连接到 RS232 串口 ; 他们的工作电压在 +/- 12V ,可能会损坏您的 Arduino 控制板。) Serial.begin(9600); //开启串行通信接口并设置通信波特率 if (Serial) //表示指定的串口是否准备好 比较囧的是,这个方法只适用于Leonardo和micro的Serial Arduino Mega 特有: if