代码随想录|day 11

Day 11 动力满满

求助:请问力扣周赛我总是错过怎么办,有什么通知机制嘛,要开始了发邮件通知我一下这样。

写在前面:不知道是平台机制还是什么,我也没花时间去查看,但是特别开心我的博客有人看和点赞。

如果有想要开始刷题的朋友正好看到此刻我的学习过程,或许会对你有帮助,那就是我记录的第二意义了。

  • 我从2024/2/4的15:33开始
  • 第一道题16:14 约40min 还是太久了 中途包括我写博客,看微信,搜英文,杂七杂八的时间
  • 第二道题16:32开始 16:45写完 13min 整理要花点时间 离开玩了会 回来已经17:27了
  • 第三道题 17:43

一、理论学习

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

栈的应用特别经典:括号匹配,做完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博客

二、刷题部分

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

//这是提交过程中发现的问题 如果输入‘]’,那么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;

    }
};

150. 逆波兰表达式求值

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好看的形状,继续坚持!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值