目录
1. 用两个栈实现队列
用两个栈来实现一个队列,使用n个元素来完成 n 次在队列尾部插入整数(push)和n次在队列头部删除整数(pop)的功能。 队列中的元素为int类型。保证操作合法,即保证pop操作时队列内已有元素。
import java.util.Stack;
public class Solution {
Stack<Integer> stack1 = new Stack<Integer>();
Stack<Integer> stack2 = new Stack<Integer>();
public void push(int node) {
stack1.add(node);
}
public int pop() {
while(stack1.size()!=0){
int a = stack1.pop();
stack2.add(a);
}
int result = stack2.pop();
while(stack2.size()!=0){
int b = stack2.pop();
stack1.add(b);
}
return result;
}
}
2. 包含min函数的栈
定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的 min 函数,输入操作时保证 pop、top 和 min 函数操作时,栈中一定有元素。
此栈包含的方法有:
push(value):将value压入栈中
pop():弹出栈顶元素
top():获取栈顶元素
min():获取栈中最小元素
import java.util.Stack;
public class Solution {
Stack<Integer> stack = new Stack<Integer>();
public void push(int node) {
stack.add(node);
}
public void pop() {
int a = stack.pop();
}
public int top() {
int a = stack.pop();
stack.add(a);
return a;
}
public int min() {
int[] arr = new int[stack.size()];
for(int i=0; i<arr.length;i++){
arr[i] = stack.pop();
}
for(int i=arr.length-1; i>=0;i--){
stack.add(arr[i]);
}
int min = arr[0];
for(int i=1; i<arr.length;i++){
if(min>=arr[i]){
min = arr[i];
}
}
return min;
}
}
3. 栈的压入、弹出序列
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。
import java.util.*;
public class Solution {
public boolean IsPopOrder(int [] pushA,int [] popA) {
Stack<Integer> stack = new Stack<>();
int popNum = 0;
for(int i =0; i< pushA.length; i++){
stack.add(pushA[i]);
while(!stack.empty() && stack.peek()==popA[popNum]){
stack.pop();
popNum++;
}
}
return stack.empty();
}
}
4. 翻转单词序列
牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“nowcoder. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a nowcoder.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?
import java.util.Stack;
public class Solution {
public String ReverseSentence(String str) {
Stack<String> stack = new Stack<>();
String[] strs = str.split(" ");
for(int i=0; i< strs.length; i++){
stack.add(strs[i]);
}
String result = "";
while(stack.size()!=1){
result = result+stack.pop()+" ";
}
result = result+stack.pop();
return result;
}
}
5. 滑动窗口的最大值
给定一个长度为 n 的数组 num 和滑动窗口的大小 size ,找出所有滑动窗口里数值的最大值。
窗口大于数组长度或窗口长度为0的时候,返回空。
最开始的时候我将前面两个特殊条件的return写为了null,结果调试出错。改为return list就ac.
import java.util.*;
public class Solution {
public ArrayList<Integer> maxInWindows(int [] num, int size) {
ArrayList<Integer> list = new ArrayList<>();
if(num.length==0||size>num.length){
return list;
}
if(size==0){
return list;
}
int n = num.length+1-size;
for(int i=0; i<n; i++){
int[] tmp = new int[size];
for(int j=0; j< size; j++){
tmp[j] = num[i+j];
}
int max = max(tmp);
list.add(max);
}
return list;
}
public int max(int[] arr){
int max = 0;
for(int i=0; i<arr.length;i++){
if(max<=arr[i]){
max = arr[i];
}
}
return max;
}
}