文章目录
前言
一、删除字符串中的所有相邻重复项
1.题目解析
给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
示例:
输入:“abbaca”
输出:“ca”
解释:
例如,在 “abbaca” 中,我们可以删除 “bb” 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 “aaca”,其中又只有 “aa” 可以执行重复项删除操作,所以最后的字符串为 “ca”。
提示:
1 <= S.length <= 20000
S 仅由小写英文字母组成。
2.算法原理
我们本道题目可以通过模拟栈来完成操作。
以abbaca为例子。
如果栈顶元素和这个元素相同,我们就pop.否则我们就插入元素。
最终栈里面从顶到底剩下ac,我们还需要依次取出来,放到string中,再对这个string进行继续操作。
我们可以用数组模拟实现一个栈
在数组尾部插入删除,实现栈的进栈出栈。最后数组存留的内容,就是最后结果
3.代码编写
class Solution {
public:
string removeDuplicates(string s)
{
string ret="";
for(auto&e:s)
{ //首先判断是否有元素
if(ret.size()&&ret.back()==e)
{
ret.pop_back();
}
else
{
ret+=e;
}
}
return ret;
}
};
二、 基本计算器 II
1.题目解析
给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。
整数除法仅保留整数部分。
你可以假设给定的表达式总是有效的。所有中间结果将在 [-231, 231 - 1] 的范围内。
注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval() 。
示例 1:
输入:s = “3+2*2”
输出:7
示例 2:
输入:s = " 3/2 "
输出:1
示例 3:
输入:s = " 3+5 / 2 "
输出:5
提示:
1 <= s.length <= 3 * 105
s 由整数和算符 (‘+’, ‘-’, ‘*’, ‘/’) 组成,中间由一些空格隔开
s 表示一个 有效表达式
表达式中的所有整数都是非负整数,且在范围 [0, 231 - 1] 内
题目数据保证答案是一个 32-bit 整数
2.算法原理
我们遇到这种计算之类的问题,都需要用栈来解决。
我们以(4-3+6*4/2-123+34)为例子,画图理解一下。
大思路:把带有乘除的看作一项,计算出来,根据运算符进行入栈,最后进行相加
根据规则,先算乘除,再算加减。
我们用op表示遍历前面最近的运算符。
op初始化为 ‘+’