春招冲刺百题计划|栈

Java基础复习

  1. Java数组的声明与初始化
  2. Java ArrayList
  3. Java HashMap
  4. Java String 类
  5. Java LinkedList
  6. Java Deque继承LinkedList
  7. Java Set

第一题:有效的括号

很简单的题,从大一做到现在,就是复习一下语法。
在这里插入图片描述

class Solution {public boolean isValid(String s) {//先明确一下Java的stack用什么:Deque<Character> stack = new LinkedList<Character>();先进后出为栈//自己可以规定一下用法:addLast, removeLast和getLastint n = s.length();if(n%2!=0){return false;}Deque<Character> stack = new LinkedList<Character>();for(int i=0; i<n; i++){char cur = s.charAt(i);if(cur=='('||cur=='{'||cur=='['){stack.addLast(cur);continue;}if(stack.size()!=0){char top = stack.getLast();if(top=='(' && cur==')'){stack.removeLast();continue;}if(top=='{'&&cur=='}'){stack.removeLast();continue;}if(top=='['&&cur==']'){stack.removeLast();continue;}}return false;   }if(stack.size()==0){return true;}else{return false;}}
}

第二题:二叉树的中序遍历

中序遍历顺序:左根右。
在这里插入图片描述

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {//怎么改进成用栈呢?这里学习一位大佬的颜色标记法。作者:henrypublic List<Integer> inorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<>();Deque<Object> stack = new LinkedList<>();if(root == null){return res;}stack.push("WHITE");stack.push(root);while(!stack.isEmpty()){TreeNode node = (TreeNode)stack.pop();String color = (String)stack.pop();if (node == null) continue;if(color.equals("WHITE")){stack.push("WHITE");stack.push(node.right);stack.push("GRAY");stack.push(node);stack.push("WHITE");stack.push(node.left);}else{res.add(node.val);}}return res;}//非常简单的回溯法// List<Integer> res = new ArrayList<>();// private void traceBack(TreeNode cur){//     if(cur.left != null){//        traceBack(cur.left);//     }//     res.add(cur.val);//     if(cur.right != null){//         traceBack(cur.right);//     }// }// public List<Integer> inorderTraversal(TreeNode root) {//     if(root != null){//         traceBack(root);//     }//     return res;// }
}

第三题:移掉k个数字,要求返回最小

在这里插入图片描述
维持一个单调栈,单调栈最麻烦的是维持个数。在大佬的题解里面就直接舍弃这个。最后再处理。很有趣。
强推这个大佬的题解!一招吃遍力扣四道题,妈妈再也不用担心我被套路啦~

class Solution {public String removeKdigits(String num, int k) {//特殊情况:k>=num.length()int n = num.length();int remain = n-k;if(remain<=0){return "0";}//定义单调栈Deque<Character> stack = new LinkedList<Character>();//遍历整个num,在其中维护一个长度为无限制的单调栈for(int i=0; i<n; i++){char ch = num.charAt(i);while(!stack.isEmpty()&&k>0&&stack.peekLast()>ch){stack.pollLast();k--;}stack.offerLast(ch);}//只保留栈底的remain个元素for (int i = 0; i < k; ++i) {stack.pollLast();}//处理前导0StringBuilder ret = new StringBuilder();boolean leadingZero = true;while (!stack.isEmpty()) {char digit = stack.pollFirst();if (leadingZero && digit == '0') {continue;}leadingZero = false;ret.append(digit);}return ret.length() == 0 ? "0" : ret.toString();}// int mul[];// int n;// int res=Integer.MAX_VALUE;// int len;// List<Integer> path = new ArrayList<>();// private void traceBack(String num, int idx){//     if(idx>n){//         return;//     }//    // System.out.println("path= "+path);//     if(path.size()==len){//         int tmp=0;   //         for(int i=0; i<len; i++){//             tmp += mul[i] * path.get(i);//         }//         res = Math.min(tmp, res);//         // System.out.println(res + " "+ tmp);//         return;//     }//     for(int i=idx; i<n; i++){//         path.add(num.charAt(i)-'0');//         traceBack(num, i+1);//         path.remove(path.size()-1);//     }// }// public String removeKdigits(String num, int k) {//     //特殊情况:k>=num.length()//     n = num.length();//     if(k >= n){//         return "0";//     }//     len = n-k;//     mul = new int[n-k];//     for(int i=0; i<n-k; i++){//         mul[i] = (int) Math.pow((int)10, n-k-i-1);//         //System.out.println(mul[i]);//     }//     //肯定是把k全部用完最好。那就不删除,选择组合?变成组合问题。又想递归回溯了。//     //如果是回溯的话,我要画递归树,解空间(i之后的所有)深度(n-k)(不出所料,超时了。)//     traceBack(num, 0);//     return res+"";//     //其实我心里有一个想法,固定栈,里面保证是当前遍历的最小的四个。好像在哪里做过。我需要清醒的脑子过一遍,明天早上来。//     //起床了,还是想不到;看了题解:贪心+单调栈// }
}

第四题:去除重复字母,要求返回字典序最小

与上一题基本一致!
在这里插入图片描述

class Solution {public String removeDuplicateLetters(String s) {//看过题解过后写的,与402的核心思路是相同的。//前期工作,得到一个map (字母:出现的次数)Map<Character, Integer> container = new HashMap<>();for(int i=0; i<s.length(); i++){if(!container.containsKey(s.charAt(i))){container.put(s.charAt(i), 1);}else{container.put(s.charAt(i), container.get(s.charAt(i))+1);}}//现在出现一个问题,就是前面保留了某个字母之后,后面怎么知道呢?题解里面由加了一个set:当已经保留了,之后的就不在讨论,且数目-1Set<Character> seen = new HashSet<>();int k = container.size();Deque<Character> stack = new LinkedList<>();for(int i=0; i<s.length(); i++){if(!seen.contains(s.charAt(i))){while(!stack.isEmpty()&&container.get(stack.getLast())>1&&stack.getLast()>=s.charAt(i)){container.put(stack.getLast(), container.get(stack.getLast())-1);seen.remove(stack.getLast());stack.removeLast();} stack.addLast(s.charAt(i));seen.add(s.charAt(i));System.out.print(container + "  ");System.out.println(stack);}else{container.put(s.charAt(i), container.get(s.charAt(i))-1);}}//只取满足条件的前k个。String res="";while(!stack.isEmpty()&&k>0){res += stack.getFirst()+"";stack.removeFirst();k--;}return res;}
}

第五题:拼接最大数,与前面两题相比,多了一个合并排序。

在这里插入图片描述

class Solution {private int[] maxNumberInOne(int[] nums, int k){int res[] = new int[k];int remain = nums.length - k;Deque<Integer> stack = new LinkedList<>();for(int i=0; i<nums.length; i++){while(!stack.isEmpty()&&stack.getLast()<nums[i]&&remain>0){stack.removeLast();remain--;}stack.addLast(nums[i]);}for(int i=0; i<k&&!stack.isEmpty(); i++){res[i] = stack.getFirst();stack.removeFirst();}return res;}//不是简单的归并:查看官方题解,写了一个compare函数比如:public int compare(int[] subsequence1, int index1, int[] subsequence2, int index2) {int x = subsequence1.length, y = subsequence2.length;//按每一位比较while (index1 < x && index2 < y) {int difference = subsequence1[index1] - subsequence2[index2];if (difference != 0) {return difference;}index1++;index2++;}//比较剩余长度 谁的剩余长度大,谁就大return (x - index1) - (y - index2);}private int[] merge(int[] nums1, int[] nums2){int n1 = nums1.length;int n2 = nums2.length;int res[] = new int[n1+n2];Deque<Integer> stack = new LinkedList<>();Arrays.fill(res, 0);int i=0, j=0, k=0;for(; k<n1+n2; k++){if(compare(nums1, i, nums2, j)>0){stack.addLast(nums1[i]);i++;}else{stack.addLast(nums2[j]);j++;}res[k] = stack.getFirst();stack.removeFirst();}return res;}public int[] maxNumber(int[] nums1, int[] nums2, int k) {int res[] = new int[k];Arrays.fill(res, 0);//遍历k1和k2的多种可能(考虑挺多的):1.对于一个数组,最少选多少,最多选多少int n1 = nums1.length;int n2 = nums2.length;int maxk=Math.min(k, n1);int mink;if(n2-k>=0){mink = 0;}else{mink = k-n2; }for(int k1=mink; k1<=maxk; k1++){// System.out.println("min:" + k1 + ", max:" + (k-k1));int res1[] = maxNumberInOne(nums1, k1);int res2[] = maxNumberInOne(nums2, k-k1); // System.out.println("1: "+ Arrays.toString(res1) + "; 2: "+ Arrays.toString(res2));int tmp[] = merge(res1, res2);// System.out.println( Arrays.toString(res));if(compare(res, 0, tmp, 0)<0){res = tmp;}}return res;}
}

根据前两题的大佬的总结,核心就是得到一个单调栈。得到k种可能,每种可能做一个归并,比较。

这个合并排序要重新定义compare函数,因为单纯的选择当前的值做比较,当出现相同数字时,需要根据后续的数字来判断选择哪个数组里的。compare部分参考以下截图理解。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/826105.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

系统架构最佳实践 -- 新能源汽车产业架构设计

随着环保意识的增强和能源结构的转型&#xff0c;新能源汽车产业正迅速崛起成为汽车行业的新宠。构建一个完善的新能源汽车产业架构对于推动产业发展、提升竞争力至关重要。本文将从设计原则、关键技术、产业生态等方面&#xff0c;探讨如何设计与实现新能源汽车产业架构。 新能…

LabVIEW专栏六、LabVIEW项目

一、梗概 项目&#xff1a;后缀是.lvproj&#xff0c;在实际开发的过程中&#xff0c;一般是要用LabVIEW中的项目来管理代码&#xff0c;也就是说相关的VI或者外部文件&#xff0c;都要放在项目中来管理。 在LabVIEW项目中&#xff0c;是一个互相依赖的整体&#xff0c;可以包…

Python List 列表基础知识

1、什么是列表&#xff1f; 在实际开发中&#xff0c;经常需要将一组&#xff08;不只一个&#xff09;数据存储起来&#xff0c;以便后边的代码使用。说到这里&#xff0c;一些读者可能听说过数组&#xff08;Array&#xff09;&#xff0c;它就可以把多个数据挨个存储到一起…

springboot针对thymeleaf的使用总结

1、遍历 <ul th:if"${not #lists.isEmpty(nav.articleTypeList)}"><li th:each"articleType,articleTypeStat:${nav.articleTypeList}"></li> </ul> 注释&#xff1a;其中${not #lists.isEmpty(list)}先判断list非空&#xff0c…

数据结构:哈密顿回路基础

什么是哈密顿回路&#xff1f; 哈密顿回路&#xff08;Hamiltonian Cycle&#xff09;是图论中的一个概念&#xff0c;指的是在一个图中通过图的每个顶点恰好一次且仅一次&#xff0c;并最终回到起始顶点的闭合回路。在一个哈密顿回路中&#xff0c;除了起始和结束的顶点必须是…

TongRds docker 镜像做成与迁移(by liuhui)

TongRds docker 镜像做成与迁移 一&#xff0c;使用 docker commit 命令制作 TongRds docker 镜 像 1.1 拉取基础镜像 centos 并运行该镜像 拉取镜像&#xff1a;docker pull ubuntu 镜像列表&#xff1a;docker images 运行镜像&#xff1a;docker run -itd --name myubuntu…

每日一题(L2-011):玩转二叉树--建树+层序遍历

与L2-006近乎相同&#xff0c;先建树&#xff0c;然后遍历 #include<bits/stdc.h> using namespace std; int in[35]; int pre[35]; typedef struct Tree{int num;Tree* left;Tree* right; }T;T * build(int in1,int in2,int pre1,int pre2){T * tnew T;t->numpre[pr…

西宁市初中生地会考报名照片尺寸要求及手机自拍方法

西宁市初中生地会考即将到来&#xff0c;对于参加考试的同学们来说&#xff0c;准备一张符合规格的报名照片是整个报名流程中不可或缺的一环。一张规范的证件照不仅展示了学生的精神面貌&#xff0c;同时也是顺利报名的重要条件之一。本文将详细介绍西宁市初中生地会考报名所需…

C#Task<T>应用详解

C# 中的 Task< T> 是一个非常强大的并发编程工具&#xff0c;它允许我们异步执行操作并返回一个结果。在这篇博客中&#xff0c;我们将详细介绍 Task< T> 的应用&#xff0c;包括它的基本概念、创建方式、等待和取消等操作&#xff0c;以及一些常见的使用场景。 基…

LLM长度外推理论与实践

定义&#xff1a; 长度外推&#xff0c;即免训练长度外推&#xff0c;就是不需要用长序列数据进行额外的训练&#xff0c;只用短序列语料对模型进行训练&#xff0c;就可以得到一个能够处理和预测长序列的模型&#xff0c;即“Train Short, Test Long”。 判断方法&#xff1…

【论文源码实战】轻量化MobileSAM,分割一切大模型出现,模型缩小60倍,速度提高40倍

前言 MobileSAM模型是在2023年发布的&#xff0c;其对之前的SAM分割一切大模型进行了轻量化的优化处理&#xff0c;模型整体体积缩小了60倍&#xff0c;运行速度提高40倍&#xff0c;但分割效果却依旧很好。 MobileSAM在使用方法上沿用了SAM模型的接口&#xff0c;因此可以与…

Java对象克隆-浅拷贝与深拷贝

目录 1、对象的克隆 1.1 对象的浅拷贝 1.2 对象深拷贝 1、对象的克隆 1.1 对象的浅拷贝 在实际编程过程中&#xff0c;我们常常要遇到这种情况&#xff1a;有一个对象A&#xff0c;在某一时刻A中已经包含了一些有效值&#xff0c;此时可能会需要一个和A完全相同新对象B&am…

单页面应用使用Nginx部署页面路由直接访问404问题

使用Nginx发布单页面应用时候&#xff0c;因为只有一个index.html页面可能导致直接访问具体页面路由报404错误&#xff0c;如&#xff1a; 直接访问http://www.test.com正常 访问http://www/test.com/system/list 则报404 需要修改nginx配置让其所有未找到资源都返回到index.h…

论婚恋相亲交友软件的市场前景和开发方案H5小程序APP源码

随着移动互联网的快速发展和社交需求的日益增长&#xff0c;婚恋相亲交友软件小程序成为了越来越多单身人士的选择。本文将从市场前景、使用人群、盈利模式以及竞品分析等多个角度&#xff0c;综合论述这一领域的现状与发展趋势。 一、市场前景 在快节奏的现代生活中&#xf…

得物sign参数逆向分析与Python算法还原

文章目录 1. 写在前面2. 接口分析3. 断点分析4. Python算法还原 【&#x1f3e0;作者主页】&#xff1a;吴秋霖 【&#x1f4bc;作者介绍】&#xff1a;擅长爬虫与JS加密逆向分析&#xff01;Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚…

Postman调用OpenApi接口

首先你需要科学上网。。。。。 请求方式&#xff1a;post 请求地址&#xff1a;https://api.openai.com/v1/chat/completions 请求头&#xff1a; Authorization : Bearer key Content-Type : application/json Body : { "messages": [{ "role": &quo…

【论文精读】Bag of Tricks for Image Classification with Convolutional Neural Networks

这篇文章比较早了&#xff0c;2018年的 摘要 最近在图像分类研究方面取得的大部分进展可以归功于训练程序的改进&#xff0c;如数据增强和优化方法的改变。然而&#xff0c;在文献中&#xff0c;大多数改进要么作为实现细节简要提到&#xff0c;要么只在源代码中可见。在本文中…

JAVA 集合框架(四) Map集合详解和常用方法

Map集合是Java集合框架中的一个重要组成部分&#xff0c;它以键值对&#xff08;key-value pairs&#xff09;的形式存储数据。Map集合中的每个键都是唯一的&#xff0c;因此它不允许键的重复&#xff0c;而每个键可以关联一个值&#xff0c;同一键可以对应不同的值&#xff08…

Led驱动程序

Led驱动程序 前几篇写的程序并没有真正控制什么硬件设备,接下来我们编写第一个真正用于控制硬件的驱动程序,Led驱动。 本质上来说无论裸机程序还是linux驱动程序目前都是在2440上运行的,要控制led,自然少不了操作2440的相关寄存器。 在编写驱动之前,我们需要先简单了解一…

CV method:最新Backbone---TransNeXt

文章目录 前言一、提出问题二、模型结构1. Pixel-focused Attention&#xff08;像素聚焦注意力机制&#xff09;2. Aggregating Diverse Attentions in a Single Mixer Query embedding3. ConvGLU4. 整体模型架构 三、方法论1. PFA设计原理2. Aggregating Diverse Attention原…