29.哀家要长脑子了!

news2024/9/24 13:18:47
1.224. 基本计算器 - 力扣(LeetCode)

 这道题的特点就是它的运算符只有加和减 那么就可以通过改变数字的正负符号来代表操作加减

因为减去一个数,就是加上这个数的相反数

这个栈不是用来存放数的,而是用来存放操作符号的。代表是加还是减。用flag来代表一个操作。

flag = 1 时是操作+,flag = -1 时是操作-。这里的flag更可以看作一个乘法因子,+操作就是使这个数是一个正数,-操作就是使这个数变为一个负数。那么1就表示这个数按原值累加到结果res, -1表示这个数取它的相反数累加到结果。

要将栈初始化为1,可以把题目看作

(+1(+4+5+2)-3)+6+8)

遇到空格的时候就直接跳过

遇到 "(" 就将 flag = 1入栈,代表有一个操作要进行,默认操作为+,因为后面遇到 - 还会重新赋值

遇到 ")" 就 弹出栈顶元素,代表"( )" 中的这个操作已经完成了

遇到 ”+“ 将flag设为1,遇到 ”-“ 将flag设为-1

遇到数字,用一个while循环来取得这个数字

long num = 0; //怕溢出

while(i<n && s[i] <= '0' && s[i] >= '9'){

        num  = num * 10 + s[i] - '0';

}

然后就可以累加res了。

res += num * flag; // 哎哟 我觉得这个也神奇

class Solution {
public:
    int calculate(string s) {
        stack<int> st;
        st.push(1);
        int res = 0, flag = 1, n = s.size(), i = 0;
        while(i < n){
            if(s[i] == ' ')
                i++;
            else if(s[i] == '('){
                st.push(1);
                i++;
            }
            else if(s[i] == ')'){
                st.pop();
                i++;
            }
            else if(s[i] == '+'){
                flag = st.top();
                i++;
            }
            else if(s[i] == '-'){
                flag = -st.top();
                i++;
            }
            else{
                long num = 0;
                while(i < n && s[i] >= '0' && s[i] <= '9'){
                    num = num * 10 + s[i] - '0';    
                    i++;
                }
                res += num * flag;
            }
        }
        return res;
    }
};

其实我感觉这个是不是降低了难度,因为它只有加减同级运算。 

2.  227. 基本计算器 II - 力扣(LeetCode)

注意:● 用一个数组来模拟栈,它的本质还是先进后出,不过更加方便操作

           ● 由于乘除的优先级高于加减所以遇到乘除的时候就直接操作,遇到加减先入栈,最后累加

           ● 用一个变量pre记录上一个字符,在遇到新的数字的时候,根据这个字符来确定怎么处理                当前数字num与上一个数字(栈顶元素

如果此时遍历的字符是数字,那么就想办法取出这个数字

 如果此时遍历到的不是数字,并且也不为空 或者是 遍历到最后一个字符了,那么就看pre:

        是+:将这个数按原值放入栈中

        是-:直接改变这个数字将这个数乘上负号,变为其相反数

        是 * 或 / :直接将栈顶的数字(上次的数字)和num(这次也就是后一次取得的数字) 进行操作。

然后迭代更新pre,将num重设为0,下次重新取

最后就是累加栈中的数字辣,可以类比一下上一题都是通过这个数字的符号来代表它们的加减操作

class Solution {
public:
    int calculate(string s) {
        vector<int> st;
        char pre = '+';
        for(int i = 0; i < s.size(); i++){
            if(isdigit(s[i]){
                num = num * 10 + s[i] - '0';
            }
            if(!isdigit(s[i]) && s[i] != ' ' || i == n-1){
                switch(pre){
                    case '+':
                        st.push_back(num);
                        break;
                    case '-':
                        st.push_back(-num);
                        break;
                    case '*':
                        st.back *= num;
                        break;
                    default:
                        st.back() /= num;
                }
                pre = s[i];
                num = 0;
            }
        }
        return accumulate(st.begin(), st.end(), 0);
    }
};

做的时候,发现自己基础真的是不牢固啊。。。。

  1. 第一个 if 不能改成 else if:
            第一个 if 是结合 for 循环,取数的一个过程,如果num这个数是一个跨字符的多位数,它也可以完整的取出来
            如果是第二个字符是 if 每个字符就是独立判断,两个if语句都会进去试一下,如果是else if,意味着只有当当前字符是数字,后续的逻辑才会执行(才会去switch)
  2. 不要忘记最后一个数字,如果不加 i == n -1的话,就不会进行最后一个运算符的操作
  3. accumulate( )函数
       accumulate(st.begin(), st.end(), 0);
        参数1:累加范围的起始值 参数2:累加范围的终止 参数3:累加值得初始值

感觉这个pre用的好巧妙啊啊啊啊啊。。。。

 3.682. 棒球比赛 - 力扣(LeetCode) 

 

做完上面两道感觉这个的确是简单啊,但是还存在问题。。。 

class Solution {
public:
    int calPoints(vector<string>& operations) {
        vector<int> st;
        int n = operations.size();
        for(int i = 0; i < n; i++){
            if(operations[i] == "C"){
                st.pop_back();
            }
            else if(operations[i] == "D"){
                st.push_back(st.back() * 2);
            }
            else if(operations[i] == "+"){
                // if(st.size() >=2 ){
                    int temp = st[st.size() - 1] + st[st.size() - 2];
                    st.push_back(temp);
                // }                              
            }
            else{
                st.push_back(stoi(operations[i]));
            }
        }
   
        return accumulate(st.begin(), st.end(), 0);          
    }
};

就先别判断数字,然后有什么做什么,注意清楚题目所要求的逻辑

最后遍历累加好

4.71. 简化路径 - 力扣(LeetCode)

这个也挺有意思的我觉得。

上周什么时候写的没发呢

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

教育大模型的发展现状、创新架构及应用展望

引言 从通用大模型到教育领域的专用大模型&#xff0c;是人工智能大模型技术深化发展的必然趋势。教育大模型不是在通用大模型基础上的微调和优化&#xff0c;而是以重构未来教育图景为目标、以开放算法模型架构为基础、以创新教育应用场景为核心的系统性变革。如何厘清教育大…

数据丢失不用愁,3个手机数据恢复大师来解忧!

这个信息技术高速发展的时代&#xff0c;手机成为了生活中不可或缺的一部分。无论是重要的工作文件、珍贵的家庭照片&#xff0c;还是那些无法替代的个人记忆&#xff0c;都存储在我们的手机中。然而&#xff0c;生活中总有一些意想不到的情况&#xff0c;比如误删文件、手机丢…

外贸电商数据分析实战指南

亮数据浏览器https://www.bright.cn/proxy-types/?utm_sourcebrand&utm_campaignbrnd-mkt_cn_csdn_yingjie 引言 在行业竞争激烈、市场变化快速的跨境电商领域&#xff0c;数据采集可以帮助企业深入了解客户需求和行为&#xff0c;分析市场趋势和竞争情况&#xff0c;从而…

目标检测——无人机图像数据集

引言 亲爱的读者们&#xff0c;您是否在寻找某个特定的数据集&#xff0c;用于研究或项目实践&#xff1f;欢迎您在评论区留言&#xff0c;或者通过公众号私信告诉我&#xff0c;您想要的数据集的类型主题。小编会竭尽全力为您寻找&#xff0c;并在找到后第一时间与您分享。 …

即刻起飞——基于Amazon Bedrock快速构建生成式AI应用

即刻起飞 —— 基于 Amazon Bedrock 快速构建生成式 AI 应用 1. 前言 在百模大战中&#xff0c;AI行业的发展正在经历前所未有的变革。这场竞争不仅推动了AI技术的快速发展&#xff0c;也揭示了AI行业的新趋势。这些趋势不仅影响着我们如何看待和使用AI&#xff0c;也预示着AI…

矩阵区域和 ---- 二维前缀和

题目链接 题目: 分析: 题目的题意是:矩阵和的问题, 应该使用二维前缀和来解决 先预处理一个前缀和, 但是题目中下标是从0开始的, 为了不处理边界情况, 我么预处理出来的矩阵, 要从下标为1的位置开始, 所以前缀和矩阵的大小为m1 * n1预处理前缀和:dp[i][j] 表示: 从[1,1] 位置…

音视频开发7 音视频转换格式流程

先看条转换视频文件的命令 我们的目的是将 源文件 source_1920x1080.mp4 转换成 目标文件 dest_1280x720.flv ffmpeg -i source_1920x1080.mp4 -acodec copy -vcodec libx264 -s 1280x720 dest_1280x720.flv -acodec copy 的意思是&#xff0c;目标的 音频格式 使用和 源文…

【C++初阶】auto关键字

目录 1.auto简介 2.auto的使用 1.auto简介 在早期C/C中auto的含义是&#xff1a;使用auto修饰的变量&#xff0c;是具有自动存储器的局部变量&#xff0c;但遗憾的 是一直没有人去使用它&#xff0c;大家可思考下为什么&#xff1f; C11中&#xff0c;标准委员会赋予了auto全…

深入理解布瑞克(break)逻辑与嵌套循环的奥秘

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言&#xff1a;布瑞克逻辑是什么&#xff1f; 二、布瑞克逻辑在嵌套循环中的应用 1.…

高奇琦:从大国协调到全球性机制:人工智能大模型全球治理路径探析

内容提要 人工智能大模型全球治理的关键是对大模型进行科学分类。大模型可以分为超大模型和一般模型。对于超大模型的治理&#xff0c;可以参考核武器治理的思路&#xff0c;重点是实现超大模型的有限发展和不扩散。对于一般模型而言&#xff0c;要在安全可控的基础上发挥其对…

【算法】排序——加更

补充1个排序&#xff1a;希尔排序 思路&#xff1a;首先定义一个gap,从第0个数开始&#xff0c;每隔一个gap取出一个数&#xff0c;将取出来的数进行比较&#xff0c;方法类似插入排序。第二轮从第二个数开始&#xff0c;每隔一个gap取出一个数再进行插入排序。四轮就可以取完…

项目启动 | 晟泰克再度牵手盘古信息,引入IMS V6系统实现数字化深度推进

当前&#xff0c;中国汽车零部件行业的数字化转型正在快速推进&#xff0c;数字化工业软件已经广泛应用于汽车零部件的研发、生产和服务等各个环节&#xff0c;赋能行业实现降本减存&#xff0c;提质增效&#xff0c;有力推动了行业高质量发展。 成立于2003年的合肥晟泰克汽车…

【加密与解密(第四版)】第十八章笔记

第十八章 反跟踪技术 18.1 由BeginDebugged引发的蝴蝶效应 IsDebuggerPresent()函数读取当前进程PEB中的BeginDebugged标志 CheckRemoteDebuggerPresent() 反调试总结&#xff1a;https://bbs.kanxue.com/thread-225740.htm https://www.freebuf.com/articles/others-articl…

【数据结构】红黑树——领略天才的想法

个人主页&#xff1a;东洛的克莱斯韦克-CSDN博客 祝福语&#xff1a;愿你拥抱自由的风 目录 二叉搜索树 AVL树 红黑树概述 性质详解 效率对比 旋转操作 元素操作 代码实现 二叉搜索树 【数据结构】二叉搜索树-CSDN博客 AVL树 【数据结构】AVL树——平衡二叉搜索…

GitHub打不开的解决方案

1、打开https://sites.ipaddress.com/github.com/找到DNS Resource Records&#xff0c;复制github的ip地址&#xff0c;先保存起来&#xff1a; 140.82.112.32、打开https://sites.ipaddress.com/fastly.net/找到DNS Resource Records&#xff0c;复制其中一个ip地址&#xf…

ComfyUI 高级实战:极速稳定视频风格转绘

大家好&#xff0c;我是每天分享AI应用的萤火君&#xff01; 重绘视频一直是短视频平台上的热点内容&#xff0c;流量不错。重绘视频一般是将真实视频重绘为动漫风格&#xff0c;或者是使用新的人物形象重放视频中的人物动作&#xff0c;再或者只是重绘视频中的部分内容&#…

Android 音视频从入门到提高 -- 任务列表——task1

1.在 Android 平台绘制一张图片&#xff0c;使用至少3种不同的 APl&#xff0c;lmageView&#xff0c;SurfaceView&#xff0c;自定义 Vew 布局xml <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.a…

通配符证书和多域名证书主要区别以及如何选择

一、通配符证书与多域名证书的主要区别 1.覆盖域名范围 通配符证书可以保护一个主域名及其所有二级子域名&#xff0c;并对该级子域名数量无限制。这种特性使得通配符证书在拥有大量子域名的网站上非常受欢迎&#xff0c;可以大大简化证书管理和维护工作。 多域名证书允许在…

基于ChatGPT+RPA的融资融券业务担保资产风险评价

原载《会计之友》2024年第2期 作者简介 李闻一 男&#xff0c;湖北洪湖人&#xff0c;华中师范大学经济与工商管理学院教授、博士生导师&#xff0c;会计学科带头人&#xff0c;研究方向&#xff1a;财务共享、公司金融、风险管理 黄怡凡 女&#xff0c;湖北公安人&#xf…

2024中青杯数学建模竞赛A题人工智能视域下养老辅助系统的构建思路代码论文分析

2024中青杯数学建模A题论文和代码已完成&#xff0c;代码为A题全部问题的代码&#xff0c;论文包括摘要、问题重述、问题分析、模型假设、符号说明、模型的建立和求解&#xff08;问题1模型的建立和求解、问题2模型的建立和求解、问题3模型的建立和求解&#xff09;、模型的评价…