一二三四五 上山打老虎

Leetcode每日一题-2021-7-5<原子的数量>(字符串表达式计算题)

链接:https://leetcode-cn.com/problems/number-of-atoms/
726. 原子的数量
思路:可以转换为计算带括号的表达式中元素的个数,等价于将表达式去括号后合并同类项。
方法1:题目中定义的表达式中化学元素个数的计算方法相当于乘法,字符串在前,数字在后,数值1省略,且表达式中存在括号的题目。可以采用通用表达式计算方法:栈或递归
详情参考官方题解,缺点是栈的遍历复杂。
方法2:
逆序遍历去括号,定义一个整数ans表示当前层级的化学符号具有的个数,遇见右括号则把括号右边的数值乘到ans,定义一个栈来存放每层括号所乘以的值(没乘则为1),遇见左括号则将ans除以栈顶值(左括号所在层级的乘值),遇见字符串则拼接出化学元素后插入map中,由于map默认排序,遍历完成后枚举map拼接字符串即可。
总结:
1,t.first,t.second不是函数没有括号
2,int num=stoi(string str);字符串和整型相互转换函数复习一下
3,string str=to_string(int num);

代码:

class Solution {
public:
    string countOfAtoms(string f) {
        map<string,int>mp;
        int ans=1;
        string num="";
        stack<int> s;
        for(int i=f.size()-1;i>=0;i--){
            if(f[i]>='0'&&f[i]<='9'){
                num=f[i]+num;
            }
            else if(f[i]=='('){
                ans/=s.top();
                s.pop();
            }
            else if(f[i]==')'){
                if(num!=""){
                    ans*=stoi(num);
                    s.push(stoi(num));
                    num="";
                }
                else s.push(1);
            }
            else {
                string atm="";
                while(f[i]<='z'&&f[i]>='a'&&i>=0){
                    atm=f[i]+atm;
                    i--;
                }
                atm=f[i]+atm;
                if(num!=""){
                    mp[atm]+=ans*stoi(num);
                    num="";
                }
                else mp[atm]+=ans;
            }
        }
        string res="";
            for(auto t:mp){
                res+=t.first;
                if(t.second>1)
                res+=to_string(t.second);
            }
            return res;
    }
};
posted @   abestxun  阅读(105)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示