春招冲刺百题计划|栈

2024-04-20 12:44
文章标签 计划 百题 冲刺 春招

本文主要是介绍春招冲刺百题计划|栈,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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.chinasem.cn/article/920288

相关文章

Oracle数据库执行计划的查看与分析技巧

《Oracle数据库执行计划的查看与分析技巧》在Oracle数据库中,执行计划能够帮助我们深入了解SQL语句在数据库内部的执行细节,进而优化查询性能、提升系统效率,执行计划是Oracle数据库优化器为... 目录一、什么是执行计划二、查看执行计划的方法(一)使用 EXPLAIN PLAN 命令(二)通过 S

两个月冲刺软考——访问位与修改位的题型(淘汰哪一页);内聚的类型;关于码制的知识点;地址映射的相关内容

1.访问位与修改位的题型(淘汰哪一页) 访问位:为1时表示在内存期间被访问过,为0时表示未被访问;修改位:为1时表示该页面自从被装入内存后被修改过,为0时表示未修改过。 置换页面时,最先置换访问位和修改位为00的,其次是01(没被访问但被修改过)的,之后是10(被访问了但没被修改过),最后是11。 2.内聚的类型 功能内聚:完成一个单一功能,各个部分协同工作,缺一不可。 顺序内聚:

《计算机视觉工程师养成计划》 ·数字图像处理·数字图像处理特征·概述~

1 定义         从哲学角度看:特征是从事物当中抽象出来用于区别其他类别事物的属性集合,图像特征则是从图像中抽取出来用于区别其他类别图像的属性集合。         从获取方式看:图像特征是通过对图像进行测量或借助算法计算得到的一组表达特性集合的向量。 2 认识         有些特征是视觉直观感受到的自然特征,例如亮度、边缘轮廓、纹理、色彩等。         有些特征需要通

Claude Enterprise推出计划

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领域的领跑者。点击订阅,与未来同行! 订阅:https://rengongzhineng.io/ 今天推出的Claude Enterprise计划,专为企业打造安全的

为备份驱动器制定备份计划:维护数据的3大方法

时间:2014-02-26 14:49 来源:网管之家 字体:[大 中 小]   您可能已经对您的电脑进行了备份,但其实这样还是远远不够的,其并非如您所认为的那样安全。您企业备份驱动器上的文件可能与您的主系统上的文件一样,容易受到灾难的影响。根据最近流行的恶意软件CryptoLocker的感染途径显示,连接到PC的外置驱动器——辅助硬盘驱动器,例如,用于备份的外部USB硬盘驱动器,可以像

基于开源链动 2 + 1 模式、AI 智能名片与 S2B2C 商城小程序的用户忠诚度计划

摘要:本文深入探讨了在商业环境中执行用户忠诚度计划的创新途径。通过整合开源链动 2 + 1 模式、AI 智能名片以及 S2B2C 商城小程序等先进元素,从提供福利、解决问题和创造赚钱机会三个核心方面展开详细阐述。研究表明,这些新技术和新模式的有机结合,能够为企业打造更具吸引力和影响力的用户忠诚度计划,从而实现商业效益的最大化与可持续发展。 一、引言 在当今竞争激烈且市场环境快速变化的时代,

2024国赛论文拿奖快对照这几点及评阅要点,勿踩雷区!(国赛最后冲刺,提高获奖概率)

↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ 2024“高教社杯”全国大学生数学建模竞赛已过去第三个夜晚,小伙伴们都累了没有,如果感到思维滞涩,别忘了稍作休息,放松一下自己,准备迎接国赛非常重要的收尾阶段——论文。 国赛这几天的努力最后都

[置顶] 2014训练计划进阶版

动态规划: 区间dp,树状dp,数位dphdu3555, sgu258, sgu390  队列优化: zoj3399 最小表示法的状态压缩DP: spoj2159  专题链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=38881#overview 专题链接: http://acm.hust.edu.cn/vjudg

[置顶] 2014训练计划

每个专题结束后会有5小时的专题赛~ 1、hustOJ目前支持谷歌、火狐浏览器等部分浏览器。 2、欢迎吐槽~ 3、推荐该阶段用书(以下具体算法实现多数可在此书中找到详解):算法竞赛入门经典之训练指南(刘汝佳) 4、题解报告:专题中的题目多是经典题目,百度搜索即有详细解答~ 5、专题相关知识点红字标出,建议先百度红字部分,有助于专题学习~ 6、专题时间会在"ACM 今天你AC了吗?"(12

Windows 一键定时自动化任务神器 zTasker,支持语音报时+多项定时计划执行

简介 zTasker(详情请戳 官网)是一款完全免费支持定时、热键或条件触发的方式执行多种自动化任务的小工具,支持win7-11。其支持超过100种任务类型,50+种定时/条件执行方法,而且任务列表可以随意编辑、排列、移动、更改类型,支持任务执行日志,可覆盖win自带的热键,同时支持任务列表等数据的备份及自动更新等。 简言之,比微软系统自带的任务计划要强好几倍,至少灵活性高多了,能大幅提高电脑使