0509
232.用栈实现队列
class MyQueue {Deque<Integer> inStack;Deque<Integer> outStack;public MyQueue() {inStack = new ArrayDeque<Integer>();outStack = new ArrayDeque<Integer>();}public void push(int x) {inStack.push(x);}public int pop() {if (outStack.isEmpty()) {in2Out();}return outStack.pop();}public int peek() {if (outStack.isEmpty()) {in2Out();}return outStack.peek();}public boolean empty() {return inStack.isEmpty() && outStack.isEmpty();}private void in2Out() {while (!inStack.isEmpty()) {outStack.push(inStack.pop());}}}
225. 用队列实现栈
20.有效的括号
class Solution {private static final Map<Character,Character> map=new HashMap<Character,Character>(){{put('{','}');put('(',')');put('[',']');put('?','?');}};public boolean isValid(String s) {if(s.length()>0&&!map.containsKey(s.charAt(0))) return false;LinkedList<Character> stack=new LinkedList<Character>() {{add('?');}};for(Character c:s.toCharArray()){if(map.containsKey(c)) stack.addLast(c);else if(map.get(stack.removeLast()) !=c) return false;}return stack.size()==1;}
}
0510
1047 删除字符串中的所有相邻重复项
public String removeDuplicates(String s) {char[] s1=s.toCharArray();int top=-1;for(int i=0;i<s.length();i++){if(top==-1||s1[top]!=s1[i]){s1[++top]=s1[i];}else{top--;}}return String.valueOf(s1,0,top+1);}
150.逆波兰表达式求值
public int evalRPN(String[] tokens) {Stack<Integer> numStack=new Stack<>();Integer op1,op2;for(String s:tokens){switch(s){case "+":op2=numStack.pop();op1=numStack.pop();numStack.push(op1+op2);break;case "-":op2=numStack.pop();op1=numStack.pop();numStack.push(op1-op2);break;case "*":op2=numStack.pop();op1=numStack.pop();numStack.push(op1*op2);break;case "/":op2=numStack.pop();op1=numStack.pop();numStack.push(op1/op2);break;default:numStack.push(Integer.valueOf(s));break;}}return numStack.pop();}
347.前k个高频元素
public int[] topKFrequent(int[] nums, int k) {// 优先级队列,为了避免复杂 api 操作,pq 存储数组// lambda 表达式设置优先级队列从大到小存储 o1 - o2 为从小到大,o2 - o1 反之PriorityQueue<int[]> pq = new PriorityQueue<>((o1, o2) -> o1[1] - o2[1]);int[] res = new int[k]; // 答案数组为 k 个元素Map<Integer, Integer> map = new HashMap<>(); // 记录元素出现次数for (int num : nums) map.put(num, map.getOrDefault(num, 0) + 1);for (var x : map.entrySet()) { // entrySet 获取 k-v Set 集合// 将 kv 转化成数组int[] tmp = new int[2];tmp[0] = x.getKey();tmp[1] = x.getValue();pq.offer(tmp);// 下面的代码是根据小根堆实现的,我只保留优先队列的最后的k个,只要超出了k我就将最小的弹出,剩余的k个就是答案if(pq.size() > k) {pq.poll();}}for (int i = 0; i < k; i++) {res[i] = pq.poll()[0]; // 获取优先队列里的元素}return res;}