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;
}
};
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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语句:使用策略模式优化代码结构