C++刷题记录

cpp 复制代码
#include <vector>
#include <string>
#include <stack>
#include <iostream>

using namespace std;

// s = "32@4$5@32"
int calculate(string s)
{
    vector<string> cal;
    for(int i =0;i<s.size();)
    {
        int start = i;
        while(i<s.size()&&s[i] != '@' && s[i] != '$')
        {
            i++;
        }
        cal.push_back(s.substr(start, i - start));
        if(i < s.size()&&(s[i] != '@' || s[i] != '$'))
        {
            cal.push_back(s.substr(i, 1));
            i++;
        }
    }
    vector<string> stackCal;

    for(int i=0;i<cal.size();i++)
    {
        if(cal[i]!="@"&&cal[i]!="$")
        {
            stackCal.push_back(cal[i]);
        }
        else if(cal[i]=="@")
        {
            int a = stoi(stackCal.back());
            int b = stoi(cal[++i]);
            int c = a*b+b+3;
            stackCal.back() = to_string(c);
        }
        else if(cal[i]=="$")
        {
            i++;
            stackCal.push_back(cal[i]);
        }
    }
    //双指针直接计算到最后
    int ret  = 0;
    if(stackCal.size()==1) 
    {
        return stoi(stackCal.back());
    }
    else
    {
        int a = stoi( stackCal[0]);
        for(int i=1;i<stackCal.size();i++)
        {
            int b= stoi( stackCal[i]);
            a= a*2+b*3;
        }
        return a;
    }

}


int main() {
    // Test cases
    string test1 = "32@4$5@32"; // Expected: 855
    string test2 = "1@2$3";      // Expected: 1@2=7, then 7$3 -> 7*2 + 3*3 = 23
    string test3 = "10$20@30";   // Expected: 10$20=20, then 20@30=653 -> 653
    string test4 = "5@6$7@8";    // Expected: 5@6=45, 45$7=7, 7@8=67 -> 45*2 + 7*3 + 67*3? (Need to clarify final step)

    cout << "Test 1 (32@4$5@32): " << calculate(test1) << endl;
    cout << "Test 2 (1@2$3): " << calculate(test2) << endl;
    cout << "Test 3 (10$20@30): " << calculate(test3) << endl;
    cout << "Test 4 (5@6$7@8): " << calculate(test4) << endl;

    return 0;
}

这段代码的目标是解析一个包含特殊运算符 @$ 的字符串表达式,并按照给定的规则计算最终结果。以下是代码的主要逻辑:

1. 输入字符串示例
  • 例如 "32@4$5@32",其中:

    • @ 是一个运算符,定义为 a @ b = a * b + b + 3

    • $ 是一个分隔符,表示直接拼接后续的数字,不进行运算。

2. 代码执行步骤
  • 第一步:分词(Tokenization)

    • 将字符串拆分为数字和运算符的组合。例如 "32@4$5@32" 会被拆分为:

      • ["32", "@", "4", "$", "5", "@", "32"]
  • 第二步:处理 @$ 运算符

    • 初始化一个栈 stackCal 来存储中间结果。

    • 遍历分词后的列表:

      • 如果是数字,直接压入栈。

      • 如果是 @

        • 弹出栈顶数字 a,取下一个数字 b,计算 a @ b = a * b + b + 3,并将结果压回栈。
      • 如果是 $

        • 跳过 $,直接将下一个数字压入栈。
    • 对于 "32@4$5@32"

      • 压入 "32"

      • @:计算 32 @ 4 = 32*4 + 4 + 3 = 135,栈变为 ["135"]

      • $:跳过 $,压入 "5",栈变为 ["135", "5"]

      • @:计算 5 @ 32 = 5*32 + 32 + 3 = 195,栈变为 ["135", "195"]

  • 第三步:最终计算

    • 如果栈中只有一个数字,直接返回。

    • 否则,按照 ret = ret * 2 + current_num * 3 的规则计算:

      • 初始 ret = 135

      • 计算 135 * 2 + 195 * 3 = 270 + 585 = 855

    • 最终结果为 855

相关推荐
小O的算法实验室4 分钟前
2026年IEEE TETCI,山区环境下基于双种群进化的协同无人机巡逻任务协同优化,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
A7bert77712 分钟前
【YOLOv8pose部署至RDK X5】模型训练→转换bin→Sunrise 5部署
c++·python·深度学习·yolo·目标检测
生成论实验室24 分钟前
《事件关系阴阳博弈动力学:识势应势之道》第二篇:阴阳博弈——认知的动力学基础
数据结构·人工智能·科技·神经网络·算法
li16709027036 分钟前
第二十七章:智能指针
c语言·数据结构·c++·visual studio
We་ct1 小时前
深度剖析浏览器跨域问题
开发语言·前端·浏览器·跨域·cors·同源·浏览器跨域
风筝在晴天搁浅1 小时前
字节高频题 小于n的最大数
算法
LabVIEW开发1 小时前
LabVIEW水力机组空蚀在线监测
算法·labview·labview知识·labview功能·labview程序
AI科技星1 小时前
科幻艺术书本封面:《全域数学》第一部·数术本源 第三卷 代数原本(P95-141)完整五级目录【乖乖数学】
算法·机器学习·数学建模·数据挖掘·量子计算
skywalk81631 小时前
在考虑双轨制,即在中文语法的基础上,加上数学公式的支持,这样像很多计算将更加简单方便,就像现在的小学数学课本里面一样,比如:定x=2*x + 1
开发语言
风筝在晴天搁浅1 小时前
LeetCode 92.反转链表Ⅱ
算法·leetcode·链表