华为od面试手撕代码真题题型8——栈,单调栈

news2024/10/22 17:01:50

1 Linux路径处理

原题:71. 简化路径 - 力扣(LeetCode)

思路:
1.使用栈来存储路径

2.遍历路径,遇到**…则弹出栈顶元素,遇到.**或者空字符串则跳过,其他情况则入栈

3.最后将栈中元素用**/*连接起来

public String simplifyPath(String path) {
    //将path用"\"切割
    String[] sp = path.split("/");

    Deque<String> stack = new ArrayDeque<>();
    for(String str : sp){
        if (str.equals("..")){ //当前字符串为".." 若栈不为空则栈顶出栈一个元素
            if(!stack.isEmpty())stack.pop();
        }else if(str.equals(".") || str.equals("")){ //若当前字符为"." 或是""空字符串(切割可能产生空字符串) 则跳过
            continue;
        }else{ //入栈
            stack.push(str);
        }
    }

    //用栈底开始出栈,拼接到sb中
    StringBuilder sb = new StringBuilder();

    while(!stack.isEmpty()){
        sb.append("/").append(stack.pollLast());
    }
    return sb.length() == 0 ? "/" : sb.toString();
}

2 小行星碰撞

735. 小行星碰撞 - 力扣(LeetCode)

 public int[] asteroidCollision(int[] asteroids) {
        ArrayDeque<Integer> stack = new ArrayDeque<>();
        int n = asteroids.length;


        for(int i = 0; i < n; i ++){
            int cur = asteroids[i];
            boolean alive = true; //表示cur是否存在,默认为true

            //栈不为空,且cur与栈顶元素方向相反 发生碰撞
            while (alive && !stack.isEmpty() && (cur < 0 && stack.peek() > 0)){
                int absCur = Math.abs(cur);
                int absPeek = Math.abs(stack.peek());

                if (absCur < absPeek){//若cur的绝对值< peek,则碰撞后cur不存在, peek仍然存在
                    alive = false;
                }
                else if(absCur > absPeek){ //若cur的绝对值 > peek 则碰撞后cur存在,peek不存在
                    alive = true;
                    stack.pop();
                }else{ //若cur绝对值 == peek 则两者都不存在
                    alive = false;
                    stack.pop();
                }  
            }

            if (alive){
                stack.push(cur);
            }
        }

        int[] ans = new int[stack.size()];

        int j = 0;
        while (!stack.isEmpty()){
            ans[j] = stack.pollLast();
            j ++;
        }
        return ans;
    }

3 括号内字符串翻转

1190. 反转每对括号间的子串 - 力扣(LeetCode)

思路:

左括号,则将之前准备好的sb入栈,并重置sb

右括号 将当前sb翻转,并出栈一个字符串插到翻转后的sb最前面

    public String reverseParentheses(String s) {
        int n = s.length();

        StringBuilder sb = new StringBuilder();
        Deque<String> stack = new ArrayDeque<>();

        for (int i = 0; i < n; i ++){
            char c = s.charAt(i);

            if (c == '('){ //入栈'('之前的sb,然后重置sb
                stack.push(sb.toString());
                sb = new StringBuilder();
            }else if (c == ')'){//翻转')'之前的sb,并将栈顶元素出栈插到翻转后sb最前面
                sb.reverse();
                sb.insert(0, stack.pop());
            }else{ //普通字符 则加入sb
                 sb.append(c);
            }
        }
        return sb.toString();
    }

4 有效的括号

20. 有效的括号 - 力扣(LeetCode)

思路:遇到左括号则入栈,遇到右括号则出栈(出栈时需进行括号匹配)

  public boolean isValid(String s) {
       int n = s.length();

       Deque<Character> stack = new ArrayDeque<>();
       
       for (int i = 0; i < n; i++){
            char c = s.charAt(i);

            //当c为左括号 入栈
            if (c == '(' || c == '{' || c =='['){
                stack.push(c);
            }else{//当c为右括号,进行括号匹配
                
                //如果此刻栈为空,则没有左括号与该右括号匹配 返回false
                if (stack.isEmpty()) return false;

                //先将栈顶元素拿到(不是出栈)
                char peek = stack.peek();
                
                //括号匹配方法1,左右括号是同一类型时,匹配才成功
                if (peek == '(' && c != ')') return false;
                if (peek == '[' && c != ']') return false;
                if (peek == '{' && c != '}') return false;
                //到这就是匹配成功 出栈
                stack.pop();
                
                //括号匹配方法2,左右括号是同一类型时,匹配才成功
                if (peek == '(' && c == ')'){
                    //匹配成功,栈顶元素出栈
                    stack.pop();
                }else if  (peek =='{' && c == '}'){
                    stack.pop();
                }else if (peek == '[' && c == ']'){
                     stack.pop();
                }else {
                    return false;
                }
                
            }
       }
       //最后栈是空 才表明括号匹配全部成功,否则表示有括号匹配失败 返回false
        return stack.isEmpty() ? true : false;
    }

单调栈

1 移除k位数字,求最小数 (遇到换题)

402. 移掉 K 位数字 - 力扣(LeetCode)

思路:通过单调栈,保证每次新加入的字符都比前面的字符小,遇到大的字符则移除,这样可以形成最小的数。代码通过遍历和判断来移除尽量大的数字,并在必要时移除队列尾部的元素。

public String removeKdigits(String num, int k) {
        if (num.length() <= k) return "0";

        //使用双端队列来保存可能的最小数字
        LinkedList<Character> deque = new LinkedList<>();
        int n = num.length();

        //遍历num中的每个字符
        for (int i = 0; i < n; i++) {
            char c = num.charAt(i);
            //当队列不空且 k > 0 且队尾字符大于当前字符时,移除队尾字符
            while (!deque.isEmpty() && k >0 && deque.peekLast() > c){
                deque.pollLast(); //移除队尾元素
                k --; //移除的字符数减少一个
            }
            //将当前字符添加到队列的末尾
            deque.offerLast(c);
        }
        //如果还没够删够k位数字,继续删除队列尾部的字符
        for (int i = 0; i < k; i++) {
            deque.pollLast();
        }

        //构建最终结果
        StringBuilder sb = new StringBuilder();
        boolean leadingZero = true; //是否遇到前导零
        while (!deque.isEmpty()){
            char digit = deque.pollFirst(); //取出队列中的第一个字符
            //如果遇到前导零,则跳过
            if (leadingZero && digit == '0'){
                continue;
            }
            leadingZero = false; //一旦遇到非零字符,就不再是前导零
            sb.append(digit); //将非前导零字符添加到结果中
        }
        //如果结果为空,则返回0
        return sb.length() == 0 ? "0" : sb.toString();
    }

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

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

相关文章

vue3【实战】 渲染 md 文件(markdown语法 .md后缀的文件)

1. 安装相关插件 npm i unplugin-vue-markdown markdown-it-prism prism unhead/vue2. 添加配置 src/main.ts // 给 md 文件创建头部 import { createHead } from unhead/vue // md 文件中代码高亮的样式 import prismjs/themes/prism.css // 自定义 md 文件的样式 import /as…

【JAVA面试题】什么是Springboot的自动配置以及注意事项

文章目录 强烈推荐核心概念&#xff1a;自动配置的关键特点&#xff1a;示例&#xff1a; 需要注意的点1.默认配置可能不适合所有场景2.Bean 冲突与覆盖3.应用启动慢的问题4.过度依赖自动配置5.安全性问题6.依赖冲突与版本兼容7.过多不必要的自动配置8.调试困难 专栏集锦 强烈推…

.net framework 3.5sp1安装错误卡住不动怎么解决

解决 .NET Framework 3.5 SP1 安装错误卡住的问题&#xff0c;可以尝试以下几种方法&#xff1a; 1.使用 DISM 工具&#xff1a; 将下载的 NetFx3.cab 文件放置在 C:\Windows 文件夹下。 以管理员身份打开命令提示符&#xff0c;输入以下命令&#xff1a; dism /online /En…

【web前端设计】jquery图标动画特效

学习目标 学习web前端设计技术&#xff08;HTML、css、JavaScript、jQuery等&#xff09;&#xff0c;综合运用技术&#xff0c;将其与HTML元素结合&#xff0c;设计样式、监听事件、添加动画等&#xff0c;给用户呈现出更好的视觉交互效果。本文主要学习分页按钮自动放大、元…

HCIP-HarmonyOS Application Developer 习题(十二)

&#xff08;多选&#xff09;1、声明式开发范式的转场动画包含以下哪几种类型? A、页面间转场 B、应用间转场 C、共享元素转场 D、组件内转场 答案&#xff1a;ACD 分析&#xff1a; &#xff08;多选&#xff09;2、公共事件服务为应用程序提供哪些能力。 A、取消发布公共…

IPMA能力基础线是什么?项目管理工具有哪些应用场景?

作为资深团队管理者&#xff0c;常常面临如何提升团队项目管理能力的挑战。其实在现代的项目管理世界中&#xff0c;有许多标准和模型帮助我们更好地理解项目的复杂性&#xff0c;IPMA&#xff08;International Project Management Association&#xff09;能力基础线就是其中…

iOS静态库(.a)及资源文件的生成与使用详解(Swift版本)

引言 在 iOS 开发中&#xff0c;开发者常常需要将一些功能模块封装成可重用的库&#xff0c;以便在多个项目中共享使用。除了常见的Framework&#xff08;动态库/静态库&#xff09;&#xff0c;静态库&#xff08;.a文件&#xff09;也是一种非常实用的封装方式。静态库在编译…

Java全栈经典面试题剖析4】JavaSE高级 -- 包装类,String, 类方法

目录 面试题3.1 什么是自动装箱与拆箱&#xff1f;用什么方式来装箱与拆箱&#xff1f; 面试题3.2 int和Integer有什么区别&#xff1f; 面试题3.3 Integer常量池 面试题3.4 字符串常量池 面试题3.5 这句代码创建了几个对象? String str1 new String("xyz");…

前端拦截302重定向

背景: 根据业务场景需要拦截302做后续的逻辑处理 尝试一: : axios拦截 、、、、、async created() {// 获取302请求返回的location后手动修改video的src路径let targetSrc;try {await axios.get(this.video).then((res) > {const { headers, status } res;const { locat…

Android 图片相识度比较(pHash)

概述 在 Android 中&#xff0c;要比对两张 Bitmap 图片的相似度&#xff0c;常见的方法有基于像素差异、直方图比较、或者使用一些更高级的算法如 SSIM&#xff08;结构相似性&#xff09;和感知哈希&#xff08;pHash&#xff09;。 1. 基于像素的差异比较 可以逐像素比较…

学习笔记——Test.pwn

前言&#xff1a;笔者也才接触Pwn&#xff0c;写这篇wp&#xff0c;记录目前所得感悟、思考、理解等。 存在错误&#xff0c;或者解释不通的地方&#xff0c;还请提出&#xff0c;已补足笔记的缺陷。 Pwn是什么&#xff1f; 我Pwn掉了你的电脑、我Pwn掉了你的设备…… 通俗的…

重庆大学软件工程考研,难度如何?

C哥专业提供——计软考研院校选择分析专业课备考指南规划 重大软件专业可谓是最好上岸的985院校&#xff01;重庆大学24考研各大学院复试录取情况已出&#xff0c; 我们先说学硕部分&#xff1a; 招生人数&#xff1a; 重庆大学软件工程学硕近几年计划统招人数都不多&#xf…

入选ECCV 2024!浙江大学联合微软亚洲研究院提出统一医学图像预训练框架UniMedI,打破医学数据异构化藩篱

让 AI 在某些条件下具备类似人类的反应能力&#xff0c;从而代替人类高效地从事特定工作&#xff0c;是 AI 领域研究人员孜孜不倦的追求。正如在医学图像和人工智能的交叉领域&#xff0c;基于视觉语言预训练的深度模型 (Visual-Language Pre-training, VLP) 凭借其自动化的特点…

Docker本地镜像发布到阿里云镜像服务的简易指南

1 阿里云容器镜像服务 阿里云容器镜像服务&#xff08;Alibaba Cloud Container Registry&#xff0c;简称ACR&#xff09;是一个为容器镜像、Helm Chart等云原生资产提供安全托管及高效分发的平台。它支持多架构容器镜像&#xff0c;包括Linux、Windows、ARM等&#xff0c;以…

心觉:感恩日记:每天5分钟,重新定义你的人生

​Hi&#xff0c;我是心觉&#xff0c;与你一起玩转潜意识、脑波音乐和吸引力法则&#xff0c;轻松掌控自己的人生&#xff01; 挑战每日一省写作207/1000天 你是否觉得生活节奏太快&#xff0c;总是有做不完的事、解决不完的问题&#xff1f; 有一个简单的方法&#xff0c;…

DEPT_ DECOMPOSED PROMPT TUNING FOR PARAMETER-EFFICIENT FINE-TUNING

论文汇总 当前的问题 (1)Prompt Tuning通常收敛缓慢&#xff0c;并且对初始化敏感&#xff1b; (2)Prompt Tuning延长了输入序列的总长度&#xff0c;从而加剧了计算需求(即训练/推理时间和内存成本)&#xff0c;这是由于Transformer的二次复杂度(Vaswani et al, 2017)。 解…

机器视觉系统硬件组成之工业相机篇

工业相机是一种非常重要的机器视觉器件&#xff0c;它能够将被采集的图像信息通过电路转换成电信号&#xff0c;再通过模数转换器&#xff08;ADC&#xff09;将其转化为数字信号&#xff0c;最后以标准的视频信号输出。工业相机在机器视觉领域得到了广泛应用&#xff0c;包括质…

springboot055服装生产管理的设计与实现(论文+源码)_kaic

毕业设计(论文) 协力服装厂服装生产管理系统 的设计与实现 学生姓名 XXX 学 号 XXXXXXXX 分院名称 XXXXXXXX 专业班级 XXXXX 指导教师 XXXX 填写…

CROss PlatformS (CROPS) 与 Docker

CROPS 是一个开源的、跨平台的开发框架&#xff0c;专为利用 Docker 容器在 Windows、macOS 和 Linux 系统上创建和管理构建主机而设计。它简化了在非 Linux 系统上运行 Yocto 项目及其他基于 Linux 的工具的过程&#xff0c;同时提供了一个可扩展的开发环境&#xff0c;支持多…

基于vue框架的的地铁站智慧管理系统的设计n09jb(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,上班打卡,下班打卡,人员管理,交接班,视频巡检,车辆巡检,车辆管理 开题报告内容 基于Vue框架的地铁站智慧管理系统的设计开题报告 一、研究背景与意义 随着城市化进程的加速&#xff0c;地铁站作为城市交通系统的重要组成部分&am…