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

java栈与队列面试题

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

设计含最小函数min()的栈,要求min、push、pop、的时间复杂度都是O(1)。min方法的作用是:就能返回是栈中的最小值。【微信面试题】

普通思路:
一般情况下,我们可能会这么想:利用min变量,每次添加元素时,都和min元素作比较,这样的话,就能保证min存放的是最小值。但是这样的话,会存在一个问题:如果最小的元素出栈了,那怎么知道剩下的元素中哪个是最小的元素呢?

改进思路:
这里需要加一个辅助栈,用空间换取时间。辅助栈中,栈顶永远保存着当前栈中最小的数值。具体是这样的:原栈中,每次添加一个新元素时,就和辅助栈的栈顶元素相比较,如果新元素小,就把新元素的值放到辅助栈中,如果新元素大,就把辅助栈的栈顶元素再copy一遍放到辅助栈的栈顶

package study;

import java.util.Stack;
 

public class MinStack {
 
private Stack<Integer> stack = new Stack<Integer>();
 private Stack<Integer> minStack = new Stack<Integer>(); //辅助栈:栈顶永远保存stack中当前的最小的元素
 
public void push(int data) {
  stack.push(data); //直接往栈中添加数据
 
//在辅助栈中需要做判断
  if (minStack.size() == 0 || data < minStack.peek()) {
   minStack.push(data);
  } else {
   minStack.add(minStack.peek()); //【核心代码】peek方法返回的是栈顶的元素
  }
 }
 
public int pop() throws Exception {
  if (stack.size() == 0) {
   throw new Exception("栈中为空");
  }
 
int data = stack.pop();
  minStack.pop(); //核心代码
  return data;
 }
 
public int min() throws Exception {
  if (minStack.size() == 0) {
   throw new Exception("栈中空了");
  }
  return minStack.peek();
 }
 
public static void main(String[] args) throws Exception {
  MinStack stack = new MinStack();
  stack.push(4);
  stack.push(3);
  stack.push(5);
System.out.println(stack.min());
 }
}

已知一组数据1、2、3、4、5依次进栈,那么它的出栈方式有很多种,请判断一下给出的出栈方式是否是正确的?

例如:
数据:
1、2、3、4、5
出栈1:
5、4、3、2、1(正确)
出栈2:
4、5、3、2、1(正确)
出栈3:
4、3、5、1、2(错误)

一个数据进栈,它可能马上出栈,也可能一会儿再出栈。

package study;

import java.util.Stack;
//方法:data1数组的顺序表示入栈的顺序。现在判断data2的这种出栈顺序是否正确   
public class StackTest {
public static boolean sequenseIsPop(int[] data1, int[] data2) {       
	Stack<Integer> stack = new Stack<Integer>(); //这里需要用到辅助栈
	for (int i = 0, j = 0; i < data1.length; i++) {            
		stack.push(data1[i]);
		while (stack.size() > 0 && stack.peek() == data2[j]) {               
			stack.pop();                
			j++;         
			}     
		}      
	return stack.size() == 0;   
	}
 	public static void main(String[] args) {
 		Stack<Integer> stack = new Stack<Integer>();
 		int[] data1 = {1, 2, 3, 4, 5};
 		int[] data2 = {4, 5, 3, 2, 1};
 		int[] data3 = {4, 5, 2, 3, 1};
 		System.out.println(sequenseIsPop(data1, data2));
 		System.out.println(sequenseIsPop(data1, data3));

 	}
 	}

 

转载于:https://my.oschina.net/u/2000675/blog/848864

相关文章:

  • java中正则表达式的使用
  • 拦截器与过滤器的区别
  • RPM方式安装MySQL5.6
  • PHP 小技巧
  • Linux系统中三类重要文件的作用与区别
  • 《剑指offer》-前n项和不准用通解和各种判断
  • 内存映射文件原理探索(转载)
  • X-Frame-Options 响应头
  • Excel 总结
  • sklearn中随机森林的参数
  • CHIL-ORACLE-修改密码
  • itunes 无法构建版本问题
  • 继续过中等难度的题目
  • Spring Boot整合WebSocket介绍
  • [技术选型] Node.js
  • ----------
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • Apache Zeppelin在Apache Trafodion上的可视化
  • Cumulo 的 ClojureScript 模块已经成型
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • IOS评论框不贴底(ios12新bug)
  • Linux链接文件
  • mongodb--安装和初步使用教程
  • MySQL数据库运维之数据恢复
  • Spring Cloud中负载均衡器概览
  • SSH 免密登录
  • Yeoman_Bower_Grunt
  • 从PHP迁移至Golang - 基础篇
  • 记一次和乔布斯合作最难忘的经历
  • 浅谈web中前端模板引擎的使用
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 软件开发学习的5大技巧,你知道吗?
  • 三栏布局总结
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 国内开源镜像站点
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • ​LeetCode解法汇总518. 零钱兑换 II
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (SpringBoot)第二章:Spring创建和使用
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (排序详解之 堆排序)
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (十一)c52学习之旅-动态数码管
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (转)树状数组
  • .net CHARTING图表控件下载地址
  • .NET DevOps 接入指南 | 1. GitLab 安装