leetcode 726. 原子的数量 “K4(ON(SO3)2)2“变为“K4N2O14S4“ (栈模拟)

6 篇文章 0 订阅

题目
在这里插入图片描述在这里插入图片描述
样例好似有毒,不知道是我孤陋寡闻,还是出题人见多识广,竟然还有Be32,,(H),,真牛逼哇。
导致右括号后一个不一定是数字,还可能是元素了,导致我每次还要las=1,因为比如(H)O2,2不该入栈的。但我们的代码是遇见右括号就要入栈,所以要las=1,将1入栈,相当于没入。

class Solution {
typedef pair<string,int> pi;
public:
    string cal(int n){342得到"342"
        string res="";
        while(n) res+=n%10+'0',n/=10;
        reverse(res.begin(),res.end());
        return res;
    }
    string countOfAtoms(string s) {
        map<string,int>mp;
        int n=s.size();
        int sum=1,las=1;stack<int>st;
        for(int i=n-1;i>=0;--i){
            //是数字不一定入栈,数字前面是左括号 才能入栈
            if(s[i]>='0'&&s[i]<='9'){//当一个数字前面是括号时 才入栈,才sum*=该数
                int tmp=1;las=(s[i]-'0')*tmp;
                while(s[i-1]>='0'&&s[i-1]<='9') tmp*=10,las+=(s[i-1]-'0')*tmp,--i;//i-1一定>=0
                continue;
            }
            else if(s[i]==')') sum*=las,st.push(las);//因为是左括号,所以要把las这个数字push到栈
            else if(s[i]>='A'&&s[i]<='Z') {
                string tmp="";tmp+=s[i];
                int tmpsum=sum;
                if(i+1<n&&s[i+1]>='0'&&s[i+1]<='9') tmpsum*=las;//元素后面是数字,应该mp[tmp]+=sum*las;
                mp[tmp]+=tmpsum;
            }
            else if(s[i]>='a'&&s[i]<='z') {
                string tmp="";tmp+=s[i-1],tmp+=s[i];
                int tmpsum=sum;
                if(i+1<n&&s[i+1]>='0'&&s[i+1]<='9') tmpsum*=las;//元素后面是数字,应该mp[tmp]+=sum*las;
                mp[tmp]+=tmpsum,--i;
            }
            else if(s[i]=='(') sum/=st.top(),st.pop();
            las=1;//比如Mg(OH)O3,比如这时las=3,到了OH)这里的右括号 应该sum*=las了,所以要las=1
        }
        vector<pi>vec;string ans="";
        for(map<string,int>::iterator it=mp.begin();it!=mp.end();++it) vec.push_back(make_pair(it->first,it->second));
        sort(vec.begin(),vec.end());//将string按字典序排序
        for(auto p:vec){
            ans+=p.first;
            if(p.second!=1) ans+=cal(p.second);//出现数量为1,就不需要标数量了
        }
        return ans;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值