Day 11 动力满满
求助:请问力扣周赛我总是错过怎么办,有什么通知机制嘛,要开始了发邮件通知我一下这样。
写在前面:不知道是平台机制还是什么,我也没花时间去查看,但是特别开心我的博客有人看和点赞。
如果有想要开始刷题的朋友正好看到此刻我的学习过程,或许会对你有帮助,那就是我记录的第二意义了。
- 我从2024/2/4的15:33开始
- 第一道题16:14 约40min 还是太久了 中途包括我写博客,看微信,搜英文,杂七杂八的时间
- 第二道题16:32开始 16:45写完 13min 整理要花点时间 离开玩了会 回来已经17:27了
- 第三道题 17:43
一、理论学习
栈的应用特别经典:括号匹配,做完20题学习代码随想录 (programmercarl.com) 我是左括号入栈,他是右括号入栈,所以我转而看力扣的同思路解法。
算法原理
栈先入后出特点恰好与本题括号排序特点一致,即若遇到左括号入栈,遇到右括号时将对应栈顶左括号出栈,则遍历完所有括号后 stack 仍然为空;
建立哈希表 dic 构建左右括号对应关系:keykeykey 左括号,valuevaluevalue 右括号;这样查询 222 个括号是否对应只需 O(1)O(1)O(1) 时间复杂度;建立栈 stack,遍历字符串 s 并按照算法流程一一判断。https://leetcode.cn/problems/valid-parentheses/solutions/9185/valid-parentheses-fu-zhu-zhan-fa-by-jin407891080/
哈希这里我没想到,我是一个个手写匹配的,这个方法巧妙,学习一下。贴一个cpp大佬的,太牛了
class Solution {
public:
bool isValid(string s) {
unordered_map<char, int> myMap = {
{'(', 1},
{'{', 2},
{'[', 3},
{']', 4},
{'}', 5},
{')', 6}
};
stack<char> mySk;
for(auto element:s)
{
if(myMap[element] < 4)
{
mySk.push(element);
}
else
{
if(mySk.empty() || myMap[element] + myMap[mySk.top()] != 7)
{
return false;
}
else
{
mySk.pop();
}
}
}
return mySk.empty();
}
};
1047. 删除字符串中的所有相邻重复项 - 力扣(LeetCode)
注意string双引号:string k=“”;
学习一个string的新用法
string a="abcd";
1.获取字符串最后一个字符
auto b=a.back(); //结果为 b='d';
2.修改字符串最后一个字符
a.back()='!'; //结果为 a="abc!";
3.获取字符串第一个字符
auto b=a.front(); //结果为 b='a';
4.修改字符串第一个字符
a.front()='!'; //结果为 a="!bcd";
150. 逆波兰表达式求值 这题得看视频了 之前手算我是ok的 现在还是重新看一下
C/C++编程笔记:stol和stoll函数,函数调用中的字符串转换-CSDN博客
二、刷题部分
//这是提交过程中发现的问题 如果输入‘]’,那么temp就未定义
if(!bracket.empty()){
temp=bracket.top();
}
class Solution {
public:
bool isValid(string s) {
stack<char>bracket;
char temp;
for(char m:s){
if(m=='{' || m=='(' || m=='['){
bracket.push(m);
}
else{
if(!bracket.empty()){
temp=bracket.top();
}
else{
temp=' ';
}
if((temp=='{'&&m=='}')||(temp=='('&&m==')')||(temp=='['&&m==']')){
bracket.pop();
}
else{
return false;
}
}
}
if(bracket.empty()){
return true;
}
return false;
}
};
1047. 删除字符串中的所有相邻重复项 - 力扣(LeetCode)
class Solution {
public:
string removeDuplicates(string s) {
stack<char>letter;
for(char m:s){
if(!letter.empty()&&letter.top()==m){
letter.pop();
}
else{
letter.push(m);
}
}
string k="";
while(!letter.empty()){
k+=letter.top();
letter.pop();
}
reverse(k.begin(),k.end());
return k;
}
};
class Solution {
public:
int evalRPN(vector<string>& tokens) {
// 力扣修改了后台测试数据,需要用longlong
stack<long long> st;
for (int i = 0; i < tokens.size(); i++) {
if (tokens[i] == "+" || tokens[i] == "-" || tokens[i] == "*" || tokens[i] == "/") {
long long num1 = st.top();
st.pop();
long long num2 = st.top();
st.pop();
if (tokens[i] == "+") st.push(num2 + num1);
if (tokens[i] == "-") st.push(num2 - num1);
if (tokens[i] == "*") st.push(num2 * num1);
if (tokens[i] == "/") st.push(num2 / num1);
} else {
st.push(stoll(tokens[i]));
}
}
int result = st.top();
st.pop(); // 把栈里最后一个元素弹出(其实不弹出也没事)
return result;
}
};
三、碎碎念
我查看了我的粉丝数据
可以看出线性增长,我要好好努力干!lc好看的形状,继续坚持!