解析网站dnshtml5做网站心得体会
news/
2025/9/28 14:07:39/
文章来源:
解析网站dns,html5做网站心得体会,网站访问速度检测,怎么做网上直营店网站232.用栈实现队列
232. 用栈实现队列
简单
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作#xff08;push、pop、peek、empty#xff09;#xff1a;
实现 MyQueue 类#xff1a;
void push(int x) 将元素 x 推到队列的末尾int pop() 从队列…232.用栈实现队列
232. 用栈实现队列
简单
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作push、pop、peek、empty
实现 MyQueue 类
void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移除并返回元素int peek() 返回队列开头的元素boolean empty() 如果队列为空返回 true 否则返回 false
说明
你 只能 使用标准的栈操作 —— 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。你所使用的语言也许不支持栈。你可以使用 list 或者 deque双端队列来模拟一个栈只要是标准的栈操作即可。
import java.util.Deque;
import java.util.LinkedList;class MyQueue {private DequeInteger stackIn; // 输入栈用于入队操作private DequeInteger stackOut; // 输出栈用于出队和获取队首元素操作public MyQueue() {this.stackIn new LinkedListInteger();this.stackOut new LinkedListInteger();}// 将元素推入输入栈public void push(int x) {stackIn.push(x);}// 从队列中弹出元素public int pop() {unload(); // 确保输出栈不为空return stackOut.pop();}// 获取队列首部的元素public int peek() {unload(); // 确保输出栈不为空return stackOut.peek();}// 检查队列是否为空public boolean empty() {if(stackIn.isEmpty() stackOut.isEmpty()){return true;}return false;}// 从输入栈向输出栈转移元素private void unload(){if(!stackOut.isEmpty()){return; // 如果输出栈不为空无需转移}// 当输出栈为空时将输入栈的元素逐个弹出并压入输出栈while (!stackIn.isEmpty()) {stackOut.push(stackIn.pop());}}
}/*** 您的 MyQueue 对象将被实例化并按如下方式调用:* MyQueue obj new MyQueue();* obj.push(x);* int param_2 obj.pop();* int param_3 obj.peek();* boolean param_4 obj.empty();*/上述代码的主要思路是将元素从输入栈中转移到输出栈中时将元素的顺序颠倒此时再从输出栈中pop或者peek元素时的顺序就是队列的先入先出的顺序。 225.用队列实现栈
225. 用队列实现栈
简单
请你仅使用两个队列实现一个后入先出LIFO的栈并支持普通栈的全部四种操作push、top、pop 和 empty。
实现 MyStack 类
void push(int x) 将元素 x 压入栈顶。int pop() 移除并返回栈顶元素。int top() 返回栈顶元素。boolean empty() 如果栈是空的返回 true 否则返回 false 。 注意
你只能使用队列的基本操作 —— 也就是 push to back、peek/pop from front、size 和 is empty 这些操作。你所使用的语言也许不支持队列。 你可以使用 list 列表或者 deque双端队列来模拟一个队列 , 只要是标准的队列操作即可。
import java.util.Queue;
import java.util.LinkedList;class MyStack {QueueInteger first; // 第一个队列QueueInteger second; // 第二个队列public MyStack() {first new LinkedList(); // 初始化第一个队列second new LinkedList(); // 初始化第二个队列}// 将元素推入栈顶public void push(int x) {first.offer(x); // 将元素添加到第一个队列中}// 弹出栈顶元素public int pop() {// 如果第一个队列不为空则将其除了最后一个元素外的所有元素转移到第二个队列中if(first.isEmpty()){QueueInteger temp first;first second;second temp;}int size first.size();for(int i 0; i size - 1; i ){second.offer(first.poll());}return first.poll(); // 返回第一个队列的最后一个元素即栈顶元素}// 获取栈顶元素public int top() {if(first.isEmpty()){QueueInteger temp first;first second;second temp;}int size first.size();for(int i 0; i size - 1; i ){second.offer(first.poll());}return first.peek(); // 返回第一个队列的最后一个元素即栈顶元素但不移除}// 检查栈是否为空public boolean empty() {if(first.isEmpty() second.isEmpty()){return true;}return false;}
}/*** 您的 MyStack 对象将被实例化并按如下方式调用:* MyStack obj new MyStack();* obj.push(x);* int param_2 obj.pop();* int param_3 obj.top();* boolean param_4 obj.empty();*/上述代码的主要思路是元素从第一个队列转移到第二个队列取第一个队列的第一个元素此时元素的顺序存在第二个队列中是没有改变的每次进行取出操作时将非空的数组当做第一个队列
20.有效的括号
20. 有效的括号
简单
提示
给定一个只包括 (){}[] 的字符串 s 判断字符串是否有效。
有效字符串需满足
左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括号。
import java.util.Deque;
import java.util.LinkedList;class Solution {public boolean isValid(String s) {DequeCharacter deque new LinkedList(); // 使用双端队列来存储左括号for(int i 0; i s.length(); i){char sChar s.charAt(i);// 如果是左括号则将对应的右括号入栈if(sChar (){deque.push());}else if(sChar {){deque.push(});}else if(sChar [){deque.push(]);}// 如果是右括号但栈为空或栈顶元素不匹配当前右括号则返回falseelse if(deque.isEmpty() || deque.peek() ! sChar){return false;}// 如果是右括号且与栈顶元素匹配则将栈顶元素出栈else{deque.pop();}}// 如果栈不为空则说明左括号多于右括号返回falseif(!deque.isEmpty()){return false;}return true; // 栈为空表示所有括号都匹配返回true}
}主要的思路是每遇到一个左括号就放一个与他对应的右括号到栈中每遇到一个右括号就去栈中找最新一个放进去的右括号匹配如果匹配就从栈中移除一个不匹配则失败。如果最后栈中还有右括号没有被匹配掉就失败
1047.删除字符串中的所有相邻重复项
1047. 删除字符串中的所有相邻重复项
简单
提示
给出由小写字母组成的字符串 S重复项删除操作会选择两个相邻且相同的字母并删除它们。
在 S 上反复执行重复项删除操作直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。 示例
输入abbaca
输出ca
解释
例如在 abbaca 中我们可以删除 bb 由于两字母相邻且相同这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 aaca其中又只有 aa 可以执行重复项删除操作所以最后的字符串为 ca。
import java.util.Deque;
import java.util.LinkedList;class Solution {public String removeDuplicates(String s) {// 使用一个栈来存储字符DequeCharacter stack new LinkedList();// 遍历输入字符串for(int i 0; i s.length(); i){// 如果栈不为空并且当前字符与栈顶字符相同if(!stack.isEmpty() stack.peek() s.charAt(i)){// 移除栈顶字符stack.pop();} else {// 将当前字符压入栈中stack.push(s.charAt(i));}}// 使用 StringBuilder 构建结果字符串StringBuilder builder new StringBuilder();// 将栈中字符出栈并添加到字符串构建器中while(!stack.isEmpty()){builder.append(stack.pop());}// 反转字符串构建器中的内容builder.reverse();// 返回去除重复字符后的结果字符串return builder.toString();}
}本质上是匹配问题
150.逆波兰表达式 150. 逆波兰表达式求值
中等
给你一个字符串数组 tokens 表示一个根据 逆波兰表示法 表示的算术表达式。
请你计算该表达式。返回一个表示表达式值的整数。
注意
有效的算符为 、-、* 和 / 。每个操作数运算对象都可以是一个整数或者另一个表达式。两个整数之间的除法总是 向零截断 。表达式中不含除零运算。输入是一个根据逆波兰表示法表示的算术表达式。答案及所有中间计算结果可以用 32 位 整数表示。 示例 1
输入tokens [2,1,,3,*]
输出9
解释该算式转化为常见的中缀算术表达式为((2 1) * 3) 9示例 2
输入tokens [4,13,5,/,]
输出6
解释该算式转化为常见的中缀算术表达式为(4 (13 / 5)) 6示例 3
输入tokens [10,6,9,3,,-11,*,/,*,17,,5,]
输出22
解释该算式转化为常见的中缀算术表达式为((10 * (6 / ((9 3) * -11))) 17) 5((10 * (6 / (12 * -11))) 17) 5((10 * (6 / -132)) 17) 5((10 * 0) 17) 5(0 17) 517 522 提示
1 tokens.length 104tokens[i] 是一个算符、-、* 或 /或是在范围 [-200, 200] 内的一个整数
import java.util.Deque;
import java.util.LinkedList;class Solution {// 计算逆波兰表达式public int evalRPN(String[] tokens) {// 使用栈存储操作数DequeInteger stack new LinkedListInteger();int n tokens.length;// 遍历逆波兰表达式的每个元素for (int i 0; i n; i) {String token tokens[i];// 如果是数字则压入栈中if (isNumber(token)) {stack.push(Integer.parseInt(token));} else {// 如果是运算符则取出栈顶的两个操作数进行计算并将结果压入栈中int num2 stack.pop();int num1 stack.pop();switch (token) {case :stack.push(num1 num2);break;case -:stack.push(num1 - num2);break;case *:stack.push(num1 * num2);break;case /:stack.push(num1 / num2);break;default:// 对于无效的运算符不做任何操作}}}// 返回栈顶元素即为最终计算结果return stack.pop();}// 判断字符串是否为数字public boolean isNumber(String token) {// 如果不是加减乘除运算符则认为是数字return !(.equals(token) || -.equals(token) || *.equals(token) || /.equals(token));}
}难点在于什么是逆波兰表达式代码思路很好理解
栈的最后表演 | LeetCode150. 逆波兰表达式求值_哔哩哔哩_bilibili
239.滑动窗口最大值
239. 滑动窗口最大值
困难
提示
给你一个整数数组 nums有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
返回 滑动窗口中的最大值 。 示例 1
输入nums [1,3,-1,-3,5,3,6,7], k 3
输出[3,3,5,5,6,7]
解释
滑动窗口的位置 最大值
--------------- -----
[1 3 -1] -3 5 3 6 7 31 [3 -1 -3] 5 3 6 7 31 3 [-1 -3 5] 3 6 7 51 3 -1 [-3 5 3] 6 7 51 3 -1 -3 [5 3 6] 7 61 3 -1 -3 5 [3 6 7] 7示例 2
输入nums [1], k 1
输出[1]提示
1 nums.length 105-104 nums[i] 1041 k nums.length
注意这里的提示k的范围
暴力解法通过40/51超时
class Solution {// 滑动窗口的最大值public int[] maxSlidingWindow(int[] nums, int k) {int n nums.length;// 初始化输出数组的长度int [] output new int[n - k 1];// 遍历数组计算滑动窗口的最大值for (int i 0; i n - k 1; i) {// 初始化当前窗口的最大值为整数最小值int max Integer.MIN_VALUE;// 遍历当前窗口内的元素寻找最大值for(int j i; j i k; j) {max Math.max(max, nums[j]);}// 将当前窗口的最大值存入输出数组output[i] max;}// 返回结果数组return output;}
}class MyQueue {DequeInteger deque new LinkedList();//弹出元素时比较当前要弹出的数值是否等于队列出口的数值如果相等则弹出//同时判断队列当前是否为空void poll(int val) {if (!deque.isEmpty() val deque.peek()) {deque.poll();}}//添加元素时如果要添加的元素大于入口处的元素就将入口元素弹出//保证队列元素单调递减//比如此时队列元素3,12将要入队比1大所以1弹出此时队列3,2void add(int val) {while (!deque.isEmpty() val deque.getLast()) {deque.removeLast();}deque.add(val);}//队列队顶元素始终为最大值int peek() {return deque.peek();}
}class Solution {public int[] maxSlidingWindow(int[] nums, int k) {if (nums.length 1) {return nums;}int len nums.length - k 1;//存放结果元素的数组int[] res new int[len];int num 0;//自定义队列MyQueue myQueue new MyQueue();//先将前k的元素放入队列for (int i 0; i k; i) {myQueue.add(nums[i]);}res[num] myQueue.peek();for (int i k; i nums.length; i) {//滑动窗口移除最前面的元素移除是判断该元素是否放入队列myQueue.poll(nums[i - k]);//滑动窗口加入最后面的元素myQueue.add(nums[i]);//记录对应的最大值res[num] myQueue.peek();}return res;}
}
239. 滑动窗口最大值
困难
提示
给你一个整数数组 nums有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
返回 滑动窗口中的最大值 。 示例 1
输入nums [1,3,-1,-3,5,3,6,7], k 3
输出[3,3,5,5,6,7]
解释
滑动窗口的位置 最大值
--------------- -----
[1 3 -1] -3 5 3 6 7 31 [3 -1 -3] 5 3 6 7 31 3 [-1 -3 5] 3 6 7 51 3 -1 [-3 5 3] 6 7 51 3 -1 -3 [5 3 6] 7 61 3 -1 -3 5 [3 6 7] 7示例 2
输入nums [1], k 1
输出[1]提示
1 nums.length 105-104 nums[i] 1041 k nums.length
class Solution {public int[] topKFrequent(int[] nums, int k) {// 统计每个数字出现的频率MapInteger,Integer map new HashMap();for(int i 0; i nums.length; i){map.put(nums[i], map.getOrDefault(nums[i], 0) 1);}// 创建一个大顶堆按照出现频率排序Queueint[] queue new PriorityQueue((m, n) - n[1] - m[1]);// 将每个数字和其频率加入堆中for(Map.EntryInteger,Integer entry : map.entrySet()){queue.add(new int[]{entry.getKey(), entry.getValue()});}// 从堆中弹出前k个高频数字int[] ans new int[k];for(int i 0; i k; i){ans[i] queue.poll()[0];}return ans;}
}Java中的队列和栈-CSDN博客
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/920718.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!