春招冲刺百题计划|栈

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;可以包…

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;同时也是顺利报名的重要条件之一。本文将详细介绍西宁市初中生地会考报名所需…

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…

论婚恋相亲交友软件的市场前景和开发方案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;要么只在源代码中可见。在本文中…

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原…

前端从零到一搭建脚手架并发布到npm

这里写自定义目录标题 一、为什么需要脚手架&#xff1f;二、前置-第三方工具的使用1. 创建demo并运行-4步新建文件夹 zyfcli&#xff0c;并初始化npm init -y配置入口文件 2.commander-命令行指令3. chalk-命令行美化工具4. inquirer-命令行交互工具5. figlet-艺术字6. ora-lo…

【算法】合并两个有序链表

本题来源---《合并两个有序链表》 题目描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4] /*** Definition for singl…

C++ - STL详解—vector类

一. vector的概念 向量&#xff08;Vector&#xff09;是一个封装了动态大小数组的顺序容器&#xff08;Sequence Container&#xff09;。跟任意其它类型容器一样&#xff0c;它能够存放各种类型的对象。可以简单的认为&#xff0c;向量是一个能够存放任意类型的动态数组。 …

win/mac达芬奇19下载:DaVinci Resolve Studio 19

DaVinci Resolve Studio 19 是一款功能强大的视频编辑和调色软件&#xff0c;广泛应用于电影、电视和网络节目的后期制作。这款软件不仅提供了专业的剪辑、调色和音频处理工具&#xff0c;还引入了全新的DaVinci Neural Engine AI工具&#xff0c;对100多项功能进行了大规模升级…

Vue3(五):组件通信详解(九种方法)

主要有九种方法&#xff0c;以下是详细解释及使用方法&#xff1a; 1.props props实现父子间的通信&#xff0c;是使用频率最高的。 &#xff08;1&#xff09;父传子&#xff1a;属性值是非函数。 以Father.vue和Child.vue 为例。 父组件中&#xff0c;引入子组件并给子组…

34、链表-合并K个升序链表

思路 1、直接全部放入集合中&#xff0c;然后排序&#xff0c;在进行构造节点返回 2、使用归并排序的方式&#xff0c;两两排序合并&#xff0c;最后合并大的。 3、第三中思路就比较巧妙了&#xff0c;可以使用小根堆&#xff0c;每次弹出堆顶&#xff0c;最小值&#xff0c…

【计算机网络】http协议的原理与应用,https是如何保证安全传输的

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…