LeetCode---Stack && Heap
402. Remove K Digits
思路:一次判断字符若比栈顶字符大则入栈,若小则pop,同时k--,直到k为0,注意最终k没有减为0或者中途栈为空或者最终结果前面带0的情况
public String removeKdigits(String num, int k) {
if(k == num.length()) return "0";
Stack<Character> s = new Stack<Character>();
int i = 0;
while(i < num.length()){
while(!s.isEmpty() && k > 0 && num.charAt(i) < s.peek()){
s.pop();
k--;
}
s.push(num.charAt(i));
i++;
}
StringBuffer str = new StringBuffer();
while(!s.isEmpty()){
str = str.append(s.pop());
}
str = str.reverse();
int j = 0;
while(j < str.length() && str.charAt(j) == '0'){
j++;
}
//有可能因为后面有递增序列k没有减为0
if(k > 0) return str.substring(0,str.length() - k);
//将前面的0去掉后有可能为""
return str.substring(j).equals("") ? "0" : str.substring(j);
}
224. Basic Calculator
思路:用sign标记前面的运算符,用result标记括号中的结果,每次遇到'('则将sign和result入栈并reset,遇到')'则计算结果
public int calculate(String s) {
int result = 0;
int sign = 1;
Stack<Integer> stack = new Stack<Integer>();
for(int i = 0; i < s.length(); i++){
if(Character.isDigit(s.charAt(i))){
//直接计算括号中的运算
int num = s.charAt(i) - '0';
while(i + 1 < s.length() && Character.isDigit(s.charAt(i + 1))){
num = num * 10 + (s.charAt(i + 1) - '0');
i++;
}
result += num * sign;
}
else if(s.charAt(i) == '+') sign = 1;
else if(s.charAt(i) == '-') sign = -1;
else if(s.charAt(i) == '('){
stack.push(result);
stack.push(sign);
result = 0;
sign = 1;
}
else if(s.charAt(i) == ')'){
result = result * stack.pop() + stack.pop();
}
}
return result;
}
总结
232. Implement Queue using Stacks:用两个栈实现队列
225. Implement Stack using Queues:用两个队列实现栈
150. Evaluate Reverse Polish Notation:遇到运算符则获取两个数进行运算以后入栈
341. Flatten Nested List Iterator:从后往前入栈,然后每次讲顶上的list转化为Integer入栈
239. Sliding Window Maximum:用优先队列将个窗口放入然后取出最大值
373. Find K Pairs with Smallest Sums:用优先队列将所有组合放入,然后取出前k个最小的
215. Kth Largest Element in an Array:用优先队列放入所有元素,取出第K大的,用优先队列比用快速排序快很多
训练
155. Min Stack:使用栈每次存当前最小值和入栈的元素,更新最小值
331. Verify Preorder Serialization of a Binary Tree:每次入栈同时出现两个'#'则出栈上一个元素并入一个'#',最后栈中只有一个'#'则返回true,注意中途判断栈空
394. Decode String:遇到']'才开始一次出栈,先获取需要被重复的字符串,然后获取次数,再入栈
295. Find Median from Data Stream:用两个优先队列min和max,保证每个队列都有一半元素且min中的元素比max中的小
提示
使用栈注意在中途出栈时判断栈空
LeetCode---Stack && Heap的更多相关文章
- [Java Basics] Stack, Heap, Constructor, I/O, Immutable, ClassLoader
Good about Java: friendly syntax, memory management[GC can collect unreferenced memory resources], o ...
- js GC & stack heap
js GC & stack heap stack 栈,函数执行形成执行栈帧,变量名,指针 heap 堆,非结构化的数据(Object),分配的内存的存储空间 js 垃圾回收机制 https:/ ...
- 笔记:程序内存管理 .bss .data .rodata .text stack heap
1.未初始化的全局变量(.bss段) bss段用来存放 没有被初始化 和 已经被初始化为0 的全局变量.如下例代码: #include<stdio.h> int bss_array[102 ...
- Stack & Heap in Java
Stack and Heap 都是Java用来在RAM中存放数据的地方.Java自动管理堆和栈,用户不能直接的设置堆或栈. Stack:存在于栈中的数据,其大小与生存周期是确定的,栈中的数据可以共享 ...
- Linux内存管理(text、rodata、data、bss、stack&heap)
一.各内存区段的介绍 系统内的程序分为程序段和数据段,具体又可细分为一下几个部分: (1)text段-代码段 text段存放程序代码,运行前就已经确定(编译时确定),通常为只读,可以直接在ROM或Fl ...
- 栈 堆 stack heap
点餐 做菜 Stack and Heap 堆和栈的区别 - Grandyang - 博客园 https://www.cnblogs.com/grandyang/p/4933011.html 在和计算机 ...
- Stack&Heap的理解
Heap(堆):在英文中有杂乱的堆意思,意译中文为堆:其特点为先进先出. 堆空间分配:一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表. Stack(栈):在英 ...
- 栈 堆 stack heap 堆内存 栈内存 内存分配中的堆和栈 掌握堆内存的权柄就是返回的指针 栈是面向线程的而堆是面向进程的。 new/delete and malloc/ free 指针与内存模型
小结: 1.栈内存 为什么快? Due to this nature, the process of storing and retrieving data from the stack is ver ...
- 栈和堆(Stack && Heap)
一.前言 直到现在,我们已经知道了我们如何声明常量类型,例如int,double,等等,还有复杂的例如数组和结构体等.我们声明他们有各种语言的语法,例如Matlab,Python等等.在C语 ...
- 【LeetCode】Heap
[215] Kth Largest Element in an Array [Medium] 给个无序数组,返回第K大的数字. 方法1. 直接使用优先队列 priority_queue class S ...
随机推荐
- 关于mybatis一对多关联时
一对多关联时注:collection标签,property属性名称,column参数字段, ofType查询返回类型,select查询方法,javaType方法的返回类型
- C语言程序设计第13次作业
一.本次课主要内容: 本章主要介绍结构的基本概念与定义.结构变量的定义和使用.结构数组应用.结构指针概念.重点介绍结构的定义与成员引用方式.同时也介绍了文件的基本概念,文件操作处理基本步骤和过程,常用 ...
- 数据结构《19》----String容器的三种实现
一.序言 一个简单的string 容器到底是如何实现的? 本文给出了 String 的三种从易到难的实现,涉及了 reference counting, copy on write 的技术. 二.第一 ...
- C# 字符串操作类
using System; using System.Collections.Generic; using System.Text; using System.Collections; using S ...
- 电量/信号的显示 imageLevel
通过imageLevel可以对1个imageView在不同的level值显示不同的图片,通常用于显示电量,wifi信号,蓝牙信号等信息: 1.编写xml ,在drawable目录 <level- ...
- Java多线程(转)
文章转自http://286.iteye.com/blog/2292038 谢谢博主的总结! 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位, ...
- Javascript 事件对象(六)键盘事件
keyCode获取用户按下键盘的哪个按键 <!DOCTYPE HTML> <html> <head> <meta http-equiv="Conte ...
- iOS8: Ignore manifest download, already have bundleID
在企业分发的app下载过程中,iOS8发现挂在官网上的企业版的app点击了提示是否安装应用程序,但始终安装不上程序,的device console发现安装的时候出现 LoadExternalDownl ...
- 去除手机浏览器input焦点默认边框(直接用outline:none就可以了)
1.使用Chrome的都知道,当鼠标焦点在input.textarea这些元素上时,Chrome默认的会给它们加上黄色的边框,我以前一直以为这是chrome的特性,没法去掉,原来是css的效果,out ...
- logcat 基本使用
adb logcat -c //清空以前的日志 adb logcat -v time > d:/sss.log //将当前日志输出到d盘的sss.log中 sss.log不 ...