LC1047 删除字符串中的所有相邻重复项
删除相邻的重复项,可以用一个栈来记录输入的内容。最后反向输出到string里就可以了。
class Solution {
public:
string removeDuplicates(string s) {
stack<char> stk;
for(auto c:s){
if(!stk.empty() && c==stk.top()){
stk.pop();
}
else{
stk.push(c);
}
}
string ans;
while(!stk.empty()){
ans+=stk.top();
stk.pop();
}
reverse(ans.begin(),ans.end());
return ans;
}
};
LC150 逆波兰表达式求职
这道题的思路和上一道题差不多,都是压到stack里面。只是上一道题直接消除了,这里是等符号压进来,然后找到顶上的两个数字,对他们做相应的操作。
灵感思路来自LC官方的解释:
逆波兰表达式:
逆波兰表达式是一种后缀表达式,所谓后缀就是指算符写在后面。
- 平常使用的算式则是一种中缀表达式,如
( 1 + 2 ) * ( 3 + 4 )
。- 该算式的逆波兰表达式写法为
( ( 1 2 + ) ( 3 4 + ) * )
。
逆波兰表达式主要有以下两个优点:
- 去掉括号后表达式无歧义,上式即便写成
1 2 + 3 4 + *
也可以依据次序计算出正确结果。- 适合用栈操作运算:遇到数字则入栈;遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中
class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<int> stk;
for(auto c:tokens){
if(c=="+" || c=="-" || c=="*" || c=="/"){
int num1=stk.top();
stk.pop();
int num2=stk.top();
stk.pop();
if(c=="+") stk.push(num2+num1);
if(c=="-") stk.push(num2-num1);
if(c=="*") stk.push(num2*num1);
if(c=="/") stk.push(num2/num1);
}
else{
stk.push(stoi(c));
}
}
return stk.top();
}
};
另外需要注意的一点是,这里的tokens是string类型的,即使是里面的某个字符也是string<char>,和char还是不一样的,所以想把某个字符转化为数字并不能想char的那样:'a'-'0'
,而是得用stoi()
等string to XX的函数。
LC239 滑动窗口最大值
hard…
先尝试了暴力…果不其然超时了
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
vector<int> ans;
int left=0;
for(int right=0;right<nums.size();){
int temp=nums[left];
right=left;
while(right-left<k){
temp=max(temp,nums[right]);
right++;
}
ans.push_back(temp);
left++;
}
return ans;
}
};