题目一:

算法思路:

一开始还是暴力解法,即遍历字符串,如果出现当前位置的字符等于后面的字符,则删除这两个字符,然后再从头遍历,如此循环即可

但是这样时间复杂度很高,每删除一次就从头遍历,会超时,此时就想想有没有能够优化的地方

那肯定有,主要问题就是没必要从头遍历,只要回退到删除字符的前一个即可,那么时间复杂度直接就为O(N)

如果第1个字符和第2个字符相同,删除后,没有第0个字符,此时则需要特判一下,则直接回退到删除字符后的第一个字符即可

如果将上述从横着转化为竖着,那么很容易联想到栈这个数据结构,因此所有操作就可以采用栈来解决,当然,也可以不使用容器,按照一开始优化分析一样对字符串进行操作

代码一(使用栈):

class Solution {public String removeDuplicates(String s) {Stack<Character> stack=new Stack();for(int i=0;i<s.length();i++){//如果栈不为空if(stack.size()>0){//如果相邻是重复的if(stack.peek()==s.charAt(i)){//删除stack.pop();//直接下一个字符continue;}else{//不相同则扔进去stack.push(s.charAt(i));}}else{//栈为空,扔进去即可stack.push(s.charAt(i));}}//将栈内的元素拿出来,注意拼接顺序StringBuffer ret=new StringBuffer();while(stack.size()>0){//头插ret.insert(0,stack.pop());}//返回结果return ret.toString();}
}

代码二(模拟栈):

class Solution {public String removeDuplicates(String s) {StringBuffer ret=new StringBuffer(s);for(int i=0;i<ret.length()-1;){//如果相邻字符相同if(ret.charAt(i)==ret.charAt(i+1)){//删除ret.delete(i,i+2);//如果不是第1位元素和第2位元素if(i!=0){//回退到删除字符的前一个i--;}}else{//不相同i++;}}return ret.toString();}
}

题目二:

算法原理:

 跟上一题几乎一模一样,就是从判断相邻元素相等变为下一个元素是否为#,如果是则删除这两个元素,只需改一下上一题的代码逻辑即可

代码:

class Solution {public boolean backspaceCompare(String s, String t) {StringBuffer ret1=new StringBuffer(s);for(int i=0;i<ret1.length();){//如果是删除键if(ret1.charAt(i)=='#'){//如果不是第1位元素if(i!=0){//删除ret1.delete(i-1,i+1);//回退到被删除字符的前一个i--;}else{//如果第一个字符是删除键//删除自己即可ret1.delete(i,i+1);}}else{//不是删除键i++;}}StringBuffer ret2=new StringBuffer(t);for(int i=0;i<ret2.length();){//如果是删除键if(ret2.charAt(i)=='#'){//如果不是第1位元素if(i!=0){//删除ret2.delete(i-1,i+1);//回退到删除字符的前一个i--;}else{//如果第一个字符是删除键//删除自己即可ret2.delete(i,i+1);}}else{//不是删除键i++;}}//如果删除完两个字符串相同if(ret1.toString().equals(ret2.toString())){return true;}else{//不同return false;}}
}

题目三:

算法原理:

这类表达式求值的题,全部都用栈来解决,也是一种标识,这道题属于表达式求值比较简单的一道,里面没有括号,因此运算顺序就是乘除在前,加减在后,需要一个整型的栈和一个字符变量op和一个整型变量tmp,字符变量默认为 '+' 号,整型变量默认为0

操作顺序是这样的

第一步:提取字符串的数字,注意如果是2位或者更多位,要全部提出来,不能碰到一个字符是数字就提出来,然后存到整型变量tmp中

第二步:判断当前字符

如果是数字:

判断字符变量op,如果是加减,就把当前tmp扔进栈中,其中减号扔的是相反数

如果是乘除,则将栈顶元素拿出来,乘或除tmp,然后把计算结果扔进栈中

如果是字符:

如果是空格,跳过

如果是加减乘除,更新字符变量op,往后进行遍历

第三步:返回结果

拿出栈中所有元素,相加并返回

代码:

class Solution {public int calculate(String s) {Stack<Integer> stack=new Stack();char op='+';for(int i=0;i<s.length();){char ch=s.charAt(i);//如果是数字   if(Character.isDigit(ch)){//提取数字int tmp=0;while(i<s.length()&&Character.isDigit(s.charAt(i))){tmp=tmp*10+(s.charAt(i)-'0');i++;}//进行运算if(op=='+'){stack.push(tmp);}else if(op=='-'){stack.push(-tmp);}else if(op=='*'){int num=stack.pop()*tmp;stack.push(num);}else{int num=stack.pop()/tmp;stack.push(num);                        }}else{//空格则跳过if(ch==' '){i++;}else{//更新运算符op=ch;i++;                    }}}//返回结果int ret=0;while(stack.size()>0){ret+=stack.pop();}return ret;}
}

题目四:

算法原理:

其实类似于带括号的运算式那种题

这道题的数字就相当于运算式的加减乘除,这道题的字符串就相当于运算式的被运算数

因此要开两个栈,一个是数字栈,一个是字符串栈

又因为这道题出现括号,所以以右括号作为判断条件,进行运算,即数字栈出一个,字符串栈出一个,然后进行运算后放回字符串栈

而作为单独出现的字符串,就直接拼接在字符串栈顶元素后面

因为一开始就有可能出现字符串,此时字符串栈为空,没有栈顶元素,所以为了后面操作具有普遍性,就提前在字符串栈中放一个空串

然后分情况讨论即可

代码:

class Solution {public String decodeString(String s) {//创建字符串栈并放一个空串进去Stack<StringBuffer> st=new Stack<>();st.push(new StringBuffer());//数字栈Stack<Integer> nums=new Stack<>();//将字符串转化为字符数组方便操作char[] ch=s.toCharArray();int i=0,n=ch.length;//遍历字符数组while(i<n){//如果是数字if(ch[i]>='0'&&ch[i]<='9'){//提取整个数字int tmp=0;while(i<n&&ch[i]>='0'&&ch[i]<='9'){tmp=tmp*10+(ch[i]-'0');i++;}//放进数字栈中nums.push(tmp);}else if(ch[i]=='['){//左括号//跳过左括号i++;//将左括号后面的字符串全部提取出来StringBuffer sb=new StringBuffer();while(i<n&&ch[i]>='a'&&ch[i]<='z'){sb.append(ch[i]);i++;}//放进字符串栈st.push(sb);}else if(ch[i]==']'){//右括号//开始运算int num=nums.pop();StringBuffer sb=st.pop();//在字符串后面拼接num次while(num-->0){st.peek().append(sb);}i++;}else{//单独的字符串StringBuffer sb=st.pop();//提取整个字符串并直接拼接while(i<n&&ch[i]>='a'&&ch[i]<='z'){sb.append(ch[i]);i++;}//放回字符串栈st.push(sb);}}//返回结果return st.pop().toString();}
}

题目五:

算法原理:

就是判断如果按照pushed的顺序入栈,能否按照popped出栈顺序,如果不能则返回false,能则返回true

那就是用栈模拟一下操作过程就行

按照入栈顺序进行入栈,如果入栈元素等于此时该出栈的元素,那么就进行出栈,因为出栈后可能出现连续出栈,所以要循环判断是否该出栈,直到不该出栈后,再进行入栈

最后看看是否按照出栈顺序全部出栈了即可

代码:

class Solution {public boolean validateStackSequences(int[] pushed, int[] popped) {Stack<Integer> stack=new Stack<>();//记录出栈顺序到哪里了int j=0;//按照pushed顺序进行入栈for(int i=0;i<pushed.length;i++){stack.push(pushed[i]);//如果此时该出栈了while(stack.size()>0&&stack.peek()==popped[j]){stack.pop();j++;}}//判断是否按照出栈顺序全部出栈return j==popped.length;}
}

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

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

相关文章

深入解析函数指针及其数组、typedef关键字应用技巧

目录 一、函数指针变量的创建 1、什么是函数指针变量&#xff1f; 2、函数是否有地址&#xff1f; 3、创建函数指针变量 4、函数指针类型解析 二、函数指针变量的使用 三、两段有趣的代码 1、解释 (*(void (*)())0)(); 2、解释 void (*signal(int, void(*)(int)))(int…

k8s集群搭建一主多从的jenkins集群

方案 --------------------- | Jenkins Master | | - 持久化配置 |<---(hostpath 存储) | - 自动容灾 | --------------------|| Jenkins JNLP 通信| ----------v---------- ------------------- | Jenkins Agent | | Kubernetes Pl…

重温k8s基础概念知识系列三(工作负载)

文章目录1、工作负载简述2、Deployment1.1、创建 Deployment1.2、检查 Deployment上线状态3、StatefulSet4、DaemonSet3.1、创建 DaemonSet3.2、运行DaemonSet5、Job5.1、运行示例 Job5.2、检查 Job 的状态6、CronJob上一节&#xff0c;我们复习了Pod相关知识&#xff0c;大多情…

开源 Arkts 鸿蒙应用 开发(十八)通讯--Ble低功耗蓝牙服务器

文章的目的为了记录使用Arkts 进行Harmony app 开发学习的经历。本职为嵌入式软件开发&#xff0c;公司安排开发app&#xff0c;临时学习&#xff0c;完成app的开发。开发流程和要点有些记忆模糊&#xff0c;赶紧记录&#xff0c;防止忘记。 相关链接&#xff1a; 开源 Arkts …

Go语言并发编程 ------ 锁机制详解

Go语言提供了丰富的同步原语来处理并发编程中的共享资源访问问题。其中最基础也最常用的就是互斥锁&#xff08;Mutex&#xff09;和读写锁&#xff08;RWMutex&#xff09;。1. sync.Mutex&#xff08;互斥锁&#xff09;Mutex核心特性互斥性/排他性&#xff1a;同一时刻只有一…

8月17日星期天今日早报简报微语报早读

8月17日星期天&#xff0c;农历闰六月廿四&#xff0c;早报#微语早读。1、《南京照相馆》领跑&#xff0c;2025年暑期档电影总票房破95亿&#xff1b;2、神舟二十号圆满完成第三次出舱任务&#xff1b;3、宇树G1人形机器人100米障碍赛再夺金牌&#xff1b;4、广东佛山新增报告基…

在QML中使用Chart组件

目录前言1. 如何安装 Chart 组件2. 创建 QML 工程时的常见问题3. 解决方案&#xff1a;改用 QApplication QQuickView修改主函数&#xff08;main.cpp&#xff09;4. QApplication 与 QGuiApplication 的差异为什么 Qt Charts 需要 QApplication&#xff1f;总结示例下载前言 …

【P40 6-3】OpenCV Python——图像融合(两张相同属性的图片按比例叠加),addWeighted()

P40 6-3 文章目录import cv2 import numpy as npback cv2.imread(./back.jpeg) smallcat cv2.imread(./smallcat1.jpeg)#只有两张图的属性是一样的才可以进行溶合 print(back.shape) print(smallcat.shape)result cv2.addWeighted(smallcat, 0.7, back, 0.3, 0) cv2.imshow(…

传输层协议 TCP(1)

传输层协议 TCP&#xff08;1&#xff09; TCP 协议 TCP 全称为 “传输控制协议(Transmission Control Protocol”). 人如其名, 要对数据的传输进行一个详细的控制; TCP 协议段格式 • 源/目的端口号: 表示数据是从哪个进程来, 到哪个进程去; • 32 位序号/32 位确认号: 后面详…

黎阳之光:以动态感知与 AI 深度赋能,引领电力智慧化转型新革命

当全球能源结构加速向清洁低碳转型&#xff0c;新型电力系统建设成为国家战略核心&#xff0c;电力行业正经历从传统运维向智慧化管理的深刻变革。2024 年《加快构建新型电力系统行动方案》明确提出&#xff0c;到 2027 年需建成全国智慧调度体系&#xff0c;实现新能源消纳率突…

自动驾驶中的传感器技术34——Lidar(9)

补盲lidar设计&#xff1a;机械式和半固态这里不再讨论&#xff0c;这里主要针对全固态补盲Lidar进行讨论1、系统架构设计采用Flash方案&#xff0c; 设计目标10m10%&#xff0c;实现30m距离的点云覆盖&#xff0c;同时可以验证不同FOV镜头的设计下&#xff0c;组合为多款产品。…

Originality AI:原创度和AI内容检测工具

本文转载自&#xff1a;Originality AI&#xff1a;原创度和AI内容检测工具 - Hello123工具导航 ** 一、AI 内容诚信管理专家 Originality AI 是面向内容创作者的全栈式质量检测平台&#xff0c;整合 AI 内容识别、抄袭查验、事实核查与可读性分析四大核心功能&#xff0c;为…

OpenCV图像平滑处理方法详解

引言 在数字图像处理中&#xff0c;图像平滑是一项基础而重要的预处理技术。它主要用于消除图像中的噪声、减少细节层次&#xff0c;为后续的图像分析&#xff08;如边缘检测、目标识别等&#xff09;创造更好的条件。OpenCV作为最流行的计算机视觉库之一&#xff0c;提供了多种…

每天两道算法题:DAY1

题目一&#xff1a;金币 题目一&#xff1a;金币 1.题目来源&#xff1a; NOIP2015 普及组 T1&#xff0c;难度红色&#xff0c;入门签到题。 2.题目描述&#xff1a; 3.题目解析&#xff1a; 问题转化&#xff1a;求下面的一个数组的前 k 项和。 4.算法原理&#xff1a; …

C++核心语言元素与构建块全解析:从语法规范到高效设计

&#x1f4cc; 为什么需要双维度学习C&#xff1f;核心语言元素 → 掌握标准语法规则&#xff08;避免未定义行为Undefined behavior&#xff09;构建块&#xff08;Building Blocks&#xff09; → 像搭积木一样组合功能&#xff08;提升工程能力&#xff09; 例如&#xff1a…

RK3588开发板Ubuntu系统烧录

Ubuntu22.04——YOLOv8模型训练到RK3588设备部署和推理 文章中给出了通过ARM设备上面的NPU进行深度学习的模型推理过程,在此之前,我们在收到一块全新的rk3588开发板后,需要对其进行系统的烧录,这里以Ubuntu22.04系统为例。 目录 1.获取待烧录系统的镜像 2.烧录工具准备 2.1…

AI评测的科学之道:当Benchmark遇上统计学

AI评测的科学之道&#xff1a;当Benchmark遇上统计学 —— 如何客观评估大模型能力&#xff0c;避免落入数据陷阱 在人工智能尤其是大语言模型&#xff08;LLU&#xff09;爆发式发展的今天&#xff0c;各类模型榜单&#xff08;如Open LLM Leaderboard、LMSys Arena&#xff0…

CSS 基础入门教程:从零开始学习样式表

一、CSS 简介CSS&#xff08;Cascading Style Sheets&#xff0c;层叠样式表&#xff09;是一种用于描述 HTML 或 XML 等文档呈现方式的语言。它是现代网页设计的三大核心技术之一&#xff0c;与HTML&#xff08;结构层&#xff09;和JavaScript&#xff08;行为层&#xff09;…

图解简单选择排序C语言实现

1 简单选择排序 简单选择排序&#xff08;Simple Selection Sort&#xff09;是一种基础且直观的排序算法&#xff0c;其核心思想是通过重复选择未排序部分中的最小&#xff08;或最大&#xff09;元素&#xff0c;并将其放到已排序部分的末尾&#xff0c;逐步完成整个序列的排…

FPS游戏时,你的电脑都在干什么(CS2)

人物介绍&#xff1a;CPU > 你忠实的处理器 i5-13600KFGPU > 你花大价钱买的显卡 RTX3060&#xff08;不是自己的配置&#xff0c;自己的是XEON E5GTX1060&#xff0c;测不出来&#xff0c;上面是社区一个好心大哥的数据&#xff0c;较为精准&#xff09;&#…